home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / qualitas / bc3 / libsrc / dpmi.asm < prev    next >
Assembly Source File  |  1992-04-09  |  70KB  |  2,282 lines

  1. nstrate the GetImage and PutImage commands }
  2.  
  3. const
  4.   r  = 20;
  5.   StartX = 100;
  6.   StartY = 50;
  7.  
  8. var
  9.   CurPort : ViewPortType;
  10.  
  11. procedure MoveSaucer(var X, Y : integer; Width, Height : integer);
  12. var
  13.   Step : integer;
  14. begin
  15.   Step := Random(2*r);
  16.   if Odd(Step) then
  17.     Step := -Step;
  18.   X := X + Step;
  19.   Step := Random(r);
  20.   if Odd(Step) then
  21.     Step := -Step;
  22.   Y := Y + Step;
  23.  
  24.   { Make saucer bounce off viewport walls }
  25.   with CurPort do
  26.   begin
  27.     if (x1 + X + Width - 1 > x2) then
  28.       X := x2-x1 - Width + 1
  29.     else
  30.       if (X < 0) then
  31.         X := 0;
  32.     if (y1 + Y + Height - 1 > y2) then
  33.       Y := y2-y1 - Height + 1
  34.     else
  35.       if (Y < 0) then
  36.         Y := 0;
  37.   end;
  38. end; { MoveSaucer }
  39.  
  40. var
  41.   Pausetime : word;
  42.   Saucer    : pointer;
  43.   X, Y      : integer;
  44.   ulx, uly  : word;
  45.   lrx, lry  : word;
  46.   Size      : word;
  47.   I         : word;
  48. begin
  49.   ClearDevice;
  50.   FullPort;
  51.  
  52.   { PaintScreen }
  53.   ClearDevice;
  54.   MainWindow('GetImage / PutImage Demonstration');
  55.   StatusLine('Esc aborts or press a key...');
  56.   GetViewSettings(CurPort);
  57.  
  58.   { DrawSaucer }
  59.   Ellipse(StartX, StartY, 0, 360, r, (r div 3)+2);
  60.   Ellipse(StartX, StartY-4, 190, 357, r, r div 3);
  61.   Line(StartX+7, StartY-6, StartX+10, StartY-12);
  62.   Circle(StartX+10, StartY-12, 2);
  63.   Line(StartX-7, StartY-6, StartX-10, StartY-12);
  64.   Circle(StartX-10, StartY-12, 2);
  65.   SetFillStyle(SolidFill, MaxColor);
  66.   FloodFill(StartX+1, StartY+4, GetColor);
  67.  
  68.   { ReadSaucerImage }
  69.   ulx := StartX-(r+1);
  70.   uly := StartY-14;
  71.   lrx := StartX+(r+1);
  72.   lry := StartY+(r div 3)+3;
  73.  
  74.   Size := ImageSize(ulx, uly, lrx, lry);
  75.   GetMem(Saucer, Size);
  76.   GetImage(ulx, uly, lrx, lry, Saucer^);
  77. {  PutImage(ulx, uly, Saucer^, XORput);               { erase image }
  78.  
  79.   { Plot some "stars" }
  80.   for I := 1 to 1000 do
  81.      PutPixel(Random(MaxX), Random(MaxY), RandColor);
  82.   X := MaxX div 2;
  83.   Y := MaxY div 2;
  84.   PauseTime := 70;
  85.  
  86.   { Move the saucer around }
  87.   repeat
  88. {     PutImage(X, Y, Saucer^, XORput);                 { draw image }
  89.      Delay(PauseTime);
  90. {     PutImage(X, Y, Saucer^, XORput);                 { erase image }
  91.      MoveSaucer(X, Y, lrx - ulx + 1, lry - uly + 1);  { width/height }
  92.   until KeyPressed;
  93.   FreeMem(Saucer, size);
  94.   WaitToGo;
  95. end; { PutImagePlay }
  96.  
  97. procedure PolyPlay;
  98. { Draw random polygons with random fill styles on the screen }
  99. const
  100.   MaxPts = 5;
  101. type
  102.   PolygonType = array[1..MaxPts] of PointType;
  103. var
  104.   Poly : PolygonType;
  105.   I, Color : word;
  106. begin
  107.   MainWindow('FillPoly demonstration');
  108.   StatusLine('Esc aborts or press a key...');
  109.   repeat
  110.     Color := RandColor;
  111.     SetFillStyle(Random(11)+1, Color);
  112.     SetColor(Color);
  113.     for I := 1 to MaxPts do
  114.       with Poly[I] do
  115.       begin
  116.         X := Random(MaxX);
  117.         Y := Random(MaxY);
  118.       end;
  119.     FillPoly(MaxPts, Poly);
  120.   until KeyPressed;
  121.   WaitToGo;
  122. end; { PolyPlay }
  123.  
  124. procedure FillStylePlay;
  125. { Display all of the predefined fill styles available }
  126. var
  127.   Style    : word;
  128.   Width    : word;
  129.   Height   : word;
  130.   X, Y     : word;
  131.   I, J     : word;
  132.   ViewInfo : ViewPortType;
  133.  
  134. procedure DrawBox(X, Y : word);
  135. begin
  136.   SetFillStyle(Style, MaxColor);
  137.   with ViewInfo do
  138.     Bar(X, Y, X+Width, Y+Height);
  139.   Rectangle(X, Y, X+Width, Y+Height);
  140.   OutTextXY(X+(Width div 2), Y+Height+4, Int2Str(Style));
  141.   Inc(Style);
  142. end; { DrawBox }
  143.  
  144. begin
  145.   MainWindow('Pre-defined fill styles');
  146.   GetViewSettings(ViewInfo);
  147.   with ViewInfo do
  148.   begin
  149.     Width := 2 * ((x2+1) div 13);
  150.     Height := 2 * ((y2-10) div 10);
  151.   end;
  152.   X := Width div 2;
  153.   Y := Height div 2;
  154.   Style := 0;
  155.   for J := 1 to 3 do
  156.   begin
  157.     for I := 1 to 4 do
  158.     begin
  159.       DrawBox(X, Y);
  160.       Inc(X, (Width div 2) * 3);
  161.     end;
  162.     X := Width div 2;
  163.     Inc(Y, (Height div 2) * 3);
  164.   end;
  165.   SetTextJustify(LeftText, TopText);
  166.   WaitToGo;
  167. end; { FillStylePlay }
  168.  
  169. procedure FillPatternPlay;
  170. { Display some user defined fill patterns }
  171. const
  172.   Patterns : array[0..11] of FillPatternType = (
  173.   ($AA, $55, $AA, $55, $AA, $55, $AA, $55 üÖü üÖü  !BBäx!!!BBäx!BBäx"""DDêp""DDêp>"""BBääêp""!"BDäêêp>IÉÆ|      ° @≥î>00>><Dêx  !BBäx""DDêp&<"DDêê&22TTêêê$> $< @äêp>          ⁿBBBB<  @@Ç****DDDDDDDU¬U¬U¬U¬U¬U¬U¬▌w▌w▌w▌w▌w▌w▌w°°°≥■°°≥≥■≥≥■■°°°    ≤  ≤  ≤≤         °                     ≡≡≡≡≡≡≡≡≡≡≡≡≡≡       ;DDD;    $"Bdÿ>@@@>||>Ac]AAA1N"A""2,  `1NA"*III*<Bü üB<<BüüüB<A" \"QIE" < <BBBB  @@    ~ ?  @ÇB$$B ""A$$"AII6 üBr»$**IIII**ccregion.  The region is defined as any pixel of
  174.             OldColor which has a path of pixels of OldColor or NewColor
  175.             with sides touching back to the seed point, (XSeed, YSeed).
  176.             Therefore, only pixels of OldColor are modified and no other
  177.             information is changed.
  178.  
  179.             SEE ALSO
  180.  
  181.             DRWFILLBOX, DRWFILLCIRCLE, DRWFILLELLIPSE, FILLAREA,
  182.             FILLCONVEXPOLY, FILLPAGE, FILLPOLY, FILLSCREEN, FILLVIEW,
  183.             SETVIEW
  184.  
  185.             EXAMPL(HNxHHO$B<BBBB<$<BBBB<<BBBB<$BBBBBF:0BBBBF:$BBBF:B<""AAA""AAAAA"<B@@B<" <2\A">>xDDxDNDD <` <>BB= > <BBBB< BBBBF:2L\bBBBB&AaQIECA8$>""">0@@A>@@@ b$(. b$(*
  186.     $    $    $DDDDDDD¬U¬U¬U¬U¬U¬U¬Uw▌w▌w▌w▌w▌w▌w▌°°°⌠ⁿ°°⌠⌠ⁿ⌠⌠ⁿⁿ°°°    ≈  ≈  ≈≈         °                     ≡≡≡≡≡≡≡≡≡≡≡≡≡≡       7HH7"B\DBBRL~BB@@@@@@?R~!!~?DDDD8BBBB|@@Ç>P>III>"AA""AAA"Uw<DDDD86II6"EIQ"\ @@ "AAAAA> >     hH02L2L$$<H(,$<>>>>>>>         VMODE=VIDEOMODEGET
  187.             IF WHICHVGA = 0 THEN STOP
  188.             DUMMY=RES640
  189.             SETVIEW 100, 100, 539, 379
  190.             FILLVIEW 10
  191.             WHILE INKEY$ = ""
  192.             WEND
  193.             VIDEOMODESET VMODE
  194.             END
  195.  
  196.  
  197.  
  198.  
  199.  
  200.  
  201.  
  202.  
  203.  
  204.  
  205.  
  206.  
  207.  
  208.  
  209.  
  210.  
  211.                                                                          63
  212.  
  213.  
  214.  
  215.  
  216.  
  217.           FONTGETINFO
  218.  
  219.             PROTOTYPE
  220.  
  221.             SUB FONTGETINFO (Width%, Height%)
  222.  
  223.             INPUT
  224.  
  225.             no input parameters
  226.     WEND
  227.             MOUSEEXIT
  228.             VIDEOMODESET VMODE
  229.             END
  230.  
  231.  
  232.  
  233.  
  234.  
  235.  
  236.  
  237.  
  238.  
  239.  
  240.  
  241.  
  242.  
  243.  
  244.  
  245.  
  246.  
  247.  
  248.  
  249.  
  250.  
  251.  
  252.  
  253.  
  254.  
  255.  
  256.  
  257.  
  258.  
  259.  
  260.  
  261.  
  262.  
  263.  
  264.  
  265.  
  266.  
  267.  
  268.  
  269.  
  270.                                                                          86
  271.  
  272.  
  273.  
  274.  
  275.  
  276.           MOUSECURSORDEFAULT
  277.  
  278.             PROTOTYPE
  279.  
  280.             SUB MOUSECURSORDEFAULT ()
  281.  
  282.             INPUT
  283.  
  284.             no input parameters
  285.  
  286.             OUTPUT
  287.  
  288.             no value returned
  289.  
  290.             USAGE
  291.  
  292.             MOUSECURSORDEFAULT defines the mouse cursor to be a small
  293.        ,K$╖┼╘╤░XQ)σ┤ö≡÷┴─┤àñT┘,╘¬àñX9╘⌠àñ\9╘UÜ╢≤`9╘4a╘d9╘UTa╘h9╘ta╘l9╘Uöa╘p9╘┤a╘t┘PT±x┴îÇ╖0▓ïα│ÅαU┤ôα╡ùα╢¢α╖úΓ╘pǺΓ╕¡αë ╚┴πì°sKÉφb<$⌡▌ë     φë φë I1φë  Eφë $YφÆë (mφë ,üφë 0$òφë á⌐φë ñ╜φë I¿╤φë ¼σφë ░∙φÆë 4²ë ┤!²ë ╕$5²ë ╝I²ë └]²ë ⌐8q²ë <àⁿΦiǬ∙PÖÇ ¥Ç
  294. ⁿ░╨â@%8@ΓΦá╝╤░≡cÑÅ*$░╕≡ż≡τ╥m¿⌡ε    ╨@#µ≈$âh$âαra╨à`¥è∩Ç%Ç +─▀ TîcOî∩â°1<@  [$¿Ç¼ MMl·0ƒ Y¼─!%6a▐è ¥ì ßá+?±  P<îaTTV ╪iÇ¡≥░ `_ñ»%Çá᪠P█º»ε`éa∙É%H«┴íA%Gár∙É
  295. iw∙Éiφ`╧≥≡╤Çmⁿ▒
  296. ]ÆAáσw7░⌡∩    $·╟Ç√É&^`  ┐ $ⁿ  $■ $╒ nk$J-ÉQ1£PéBù »0αQ/Ñ4╜£░ºP≈Ñ4Ç⌡$(ª▀$@C]Æé≈└╕_SÇçÑ4=iÉ⌠ä╣<_np@Ñ45ò▒Y3ü¼Qí░.i>╠@5+┴╙É╛╙$@ #┴@«╦
  297. $╤
  298. #@Ñú4,p&e÷ü¼_ÇQºÑ4òQ  ü@;¡_áQ@e╠≥@mp!┤a╘O░√`Pñź ÇT°8ÿ!¼Åñ$½╙"q¿ PñCÇ¿α√└╥░eT"ß<p°%Pæ(╧%pδ¥/OêW0Ǽbφ φ B@[â¼8â≥µ≤(    ¿⌡%(Ç∩áTÿp+ óÜ▓0!Σ±(1±░┤ÖÇD└D0Å╡`   $ «îO@╧1
  299. a╝╤j-0ñ│`@╖bΦaT1═⌠╝╤Σ²¼±,1öíî9lÿ28ÇÅ`Γî¿P²$,N0┴O0a╫δ≤0σú`°î╖#0δ≡└X▄1»Σî(▒¥Ç█Ñ"qá√1CÇú╟╨º Å
  300. FT Θ²î└1ÇY0    w ²à░$@AÅ`╦Φ¼╘`▄1A  }┐Ç*5 ΩSδδî`¼îaδæ¼î5 1¿⌡Ω╜⌠ ¼¥╬ü└Qî1S╛≤î9╨iÇ,∙PU(}Ç$üÇ àÇ`σìÇ`QαÜBO$%ÿÇ╧"$Ç«Ç]É.┬\`%WÉ$  W0 ÄâO0]αG┬ur╩░£▒Q¢ú╔Ç≡°s?`X0╘`@ µWâ@╣aá εdq`¥9?Ç&+o0µyÄΣAÅuV(7P╬±@IdQ╕@Å┤@;Ç▓?Çò│CÇ┤╟╨╡KÇÄ30ⁿφ° ó╬ì+]Ä╦≡     Mö╝σ ²y5<!└▀óâ╝É3~mp    $<╛≤9Æ-2ⁿ≡@T,╞Σa,)Pæ└¥#¼╪Q┤S(¼@Aîa≡╤@Ö²±⌠KëD─┴▒▀0╨Ñ$╩-0 ╨ê*╙▓edm`î=3Kß-10è=≥≤²└£mîjy ÿe²ⁿ╨i╕e▓ΣmαÖ╢C%Ç*ê*0 EátQZ`mÄLP%    °üⁿªüNQ∙  T¿<qtWΩc z░ÅÇñΩçǪçÇ«;└<┐á¼¥. á?<Σscî)áí := 0;
  301.       end;
  302.     end;
  303.   end;
  304.   WaitToGo;
  305. end; { UserLineStylePlay }
  306.  
  307.  
  308. procedure SayGoodbye;
  309. { Say goodbye and then exit the program }
  310. var
  311.   ViewInfo : ViewPortType;
  312. begin
  313.   MainWindow('');
  314.   GetViewSettings(ViewInfo);
  315.   SetTextStyle(TriplexFont, HorizDir, 4);
  316.   SetTextJustify(CenterText, CenterText);
  317.   with ViewInfo do
  318.     OutTextXY((x2-x1) div 2, (y2-y1) div 2, 'That''s all folks!');
  319.   StatusLine('Press any key to quit...');
  320.   repeat until KeyPressed;
  321. end; { SayGoodbye }
  322.  
  323.  
  324. PROCEDURE SelectMode;
  325. VAR
  326.     choice1,choice2     : CHAR;
  327.    xsize,ysize            : WORD;
  328. BEGIN
  329.     (* Let's select a mode *)
  330.     ClrScr;
  331.     WriteLn('VESADEMO:');
  332.     WriteLn('1. 256 colors');
  333.     WriteLn('2. 32768 colors');
  334.     WriteLn('3. 65536 colors');
  335.     WriteLn('4. 16777216 colors');
  336.     WriteLn('Q uit');
  337.     WriteLn;
  338.     Write('Your choice: ');
  339.     REPEAT
  340.         ReadLn(choice1);
  341.       IF choice1 <> '1' THEN BEGIN
  342.           WriteLn('Sorry !');
  343.          WriteLn('This demo wasn''t written for more as 256 colors !');
  344.          WriteLn('You would only get a limited impression of the Hi-& TrueColor modes...');
  345.          WriteLn('Switching to 256 colors.');
  346.          choice1 := '1';
  347.       END;
  348.     UNTIL choice1 IN ['1'..'4','q'];
  349.     IF choice1 = 'q' THEN Halt;
  350.  
  351.     WriteLn;
  352.     WriteLn;
  353.     WriteLn('a. 320x200');
  354.     WriteLn('b. 640x480');
  355.     WriteLn('c. 800x600');
  356.     WriteLn('d. 1024x768');
  357.     WriteLn('e. 1280x1024');
  358.     WriteLn('Q uit');
  359.     WriteLn;
  360.     Write('Your choice: ');
  361.     REPEAT
  362.         ReadLn(choice2);
  363.     UNTIL choice2 IN ['a'..'e','q'];
  364.     IF choice2 = 'q' THEN Halt;
  365.  
  366.     CASE choice2 OF
  367.         'a' : BEGIN
  368.             xsize := 320;
  369.             ysize := 200;
  370.         END;
  371.         'b' : BEGIN
  372.             xsize := 640;
  373.             ysize := 480;
  374.         END;
  375.         'c' : BEGIN
  376.             xsize := 800;
  377.             ysize := 600;
  378.         END;
  379.         'd' : BEGIN
  380.             xsize := 1024;
  381.             ysize := 768;
  382.         END;
  383.         'e' : BEGIN
  384.             xsize := 1280;
  385.             ysize := 1024;
  386.         END;
  387.     END;
  388.     CASE choice1 OF
  389.         '1' : mode := FindVesaMode(xsize,ysize,8);
  390.         '2' : mode := FindVesaMode(xsize,ysize,15);
  391.         '3' : mode := FindVesaMode(xsize,ysize,16);
  392.         '4' : mode := FindVesaMode(xsize,ysize,24);
  393.     END;
  394.     IF mode = 0 THEN BEGIN
  395.         WriteLn('No such mode could be found !');
  396.         WriteLn('Switching to to 320x200.');
  397.         ReadKey;
  398.         mode := V320x200x256;
  399.     END;
  400. END;
  401.  
  402. begin { program body }
  403.   SelectMode;
  404.   Initialize;
  405.   ReportStatus;
  406.  
  407. {  AspectRatioPlay; }
  408.   FillEllipsePlay;
  409.   SectorPlay;
  410.   WriteModePlay;
  411.  
  412.   ColorPlay;
  413.   { PalettePlay only intended to work on these drivers: }
  414.   if (GraphDriver = EGA) or
  415.       (GraphDriver = EGA64) or
  416.       (GraphDriver = VGA) then
  417.      PalettePlay;
  418.   PutPixelPlay;
  419. {  PutImagePlay; }
  420.   RandBarPlay;
  421.   BarPlay;
  422.   Bar3DPlay;
  423.   ArcPlay;
  424.   CirclePlay;
  425.   PiePlay;
  426.   LineToPlay;
  427.   LineRelPlay;
  428. {  LineStylePlay; }
  429. {  UserLineStylePlay; }
  430.   TextDump;
  431.   TextPlay;
  432.   CrtModePlay;
  433.   FillStylePlay;
  434.   FillPatternPlay;
  435.   PolyPlay;
  436.   SayGoodbye;
  437. {  CloseGraph; }
  438.   CloseVesa;
  439. end.
  440. ***************************************************
  441.     '* SHOW D2ROTATE (ABOUT THE ORIGIN)
  442.     '****************************************************************∞╥≤c≤*φè#^│v/╒:j═φ0t+l▓ô"¬"g└≡?%ªêΣ│H╫½╫╜├¿U'╒⌐⌡ ßV?╩¬ujOΦçEZ1∞▐! ▄B╛Σ8║æ]1GlNÜ┐q▌▓;ô$ΦzE<cª*bEô#ä╧ñÅ"∩─LrdaÖ ╠º╫a^¥£å╬1~)@ëÖMδ╫0═6DäFê¬Çv┼ß╨kæpτ╪É)}ª 1w3╤╧ü⌡¥╓h▓╣≈ïÅaÑ[TⁿHqªÉ╝DKÄ─Y-∞tT╤Θ╨º╟╪.*ÇI9lΦ≈{πτcσ$τπßoFr╪╨∩┼╞╟;O2■e²LÜ4^N|╪½ÅO?╔°FOz`╟╟╟'<>>π$πΘù6·Xgî╖│°oîδπGƒd╝▀░?■╪╔_9L ⌡ôⁿq'æO▀ƒn4╔▀╚▄┼3pτ.òO°·}÷╕ⁿ±'æO?ít│!√8ßÑ≤/┐╣p┼≥┘E╦Vox╕cΦé5╟╚º╙$?√$≥ΘZεsî≡åìΓpKù¢ïß X╥ 9╞≈\µk┤O¥_ 5Üö\≤éÄ┌╤A[╤ÿáï┼éNⁿÅu16    g,%hc╙╨cD╨Vï┘R¢öKñR;8εáΣ╢╪ós╤π╡á└èxgzPÄMú╫yαºÉ+σJ¢i+▓â3╥    ═Ñ╙î^ºG▓█πérφçs %#(╗⌠?┼%u8≡6+QÉ))ò)Afw≈╣╪)B&4░åLXV:δät@Å.;5Φf╢Ät┐ΣJ╫─U8úÇ╟éö£╕p╔┴⌠vg╨╬╥é÷╪╣┬ΓI.ç≡^v╤ZΦÇ& ╒┌6ñô6XßNè╡╬E₧Ñ
  443. kIº╠▄A+╣╥éb²tæ-Y¡½αÑa═uuîÇ╢αêvhuª╡SÅ┤vèùú¥F;p<d⌐/F─d█éT%▓KΦû=q■öI┐ ┐╠6S$▒÷╚ENΩ¥Fû9╔┌R'╝ ╧φ└?g┬j▓0═/b╖₧─mûé╢┌»ÿÄë/·<éò■░╤╟╢├Xσ:╥P3Θ"╬Læsφ░┌öSö!╗¿*mN£WΣÇ£┤~#╗ææ≥RΩóh:à▌.æ≈╕▌v£äàd▒à╒├=░╖π║$howeg*╬    6ù▄ƒô╕φ░Ö╢qΘD>(w@úKεHÆ╛öúΣU
  444. éÜR╔╤W▄èê 2M%ó.▓SNÖA1ùJE╢║l]▓¿>\%└Å4ßO▄£â⌐& ê/)8vSP▀▓ôⁿææ√ü√ÑÄa⌠â╚4S╓╟P- ?Σá╕▓Næ*q╡UΘ▓≈^ñ·I.rúR&$Y^╚%è≡B┌≈Ceat
  445.     Color := RandColor;
  446.     SetColor(Color);
  447.     SetFillStyle(Random(CloseDotFill)+1, Color);
  448.     Bar3D(Random(MaxWidth), Random(MaxHeight),
  449.           Random(MaxWidth), Random(MaxHeight), 0, TopOff);
  450.   until KeyPressed;
  451.   WaitToGo;
  452. end; { RandBarPlay }
  453.  
  454. procedure ArcPlay;
  455. { Draw random arcs on the screen }
  456. var
  457.   MaxRadius : word;
  458.   EndAngle : word;
  459.   ArcInfo : ArcCoordsType;
  460. begin
  461.   MainWindow('Arc / GetArcCoords demonstration');
  462.   StatusLine('Esc aborts or press a key');
  463.   MaxRadius := MaxY div 10;
  464.   repeat
  465.     SetColor(RandColor);
  466.     EndAngle := Random(360);
  467.     SetLineStyle(SolidLn, 0, NormWidth);
  468.     Arc(Random(MaxX), Random(MaxY), Random(EndAngle), EndAngle, Random(MaxRadius));
  469.     GetArcCoords(ArcInfo);
  470.     with ArcInfo do
  471.     begin
  472.       Line(X, Y, XStart, YStart);
  473.       Line(X, Y, Xend, Yend);
  474.     end;
  475.   until KeyPressed;
  476.   WaitToGo;
  477. end; { ArcPlay }
  478.  
  479. procedure PutPixelPlay;
  480. { Demonstrate the PutPixel and GetPixel commands }
  481. const
  482.   Seed   = 1962; { A seed for the random number generator }
  483.   NumPts = 2000; { The number of pixels plotted }
  484.   Esc    = #27;
  485. var
  486.   I : word;
  487.   X, Y, Color : word;
  488.   XMax, YMax  : integer;
  489.   ViewInfo    : ViewPortType;
  490. begin
  491.   MainWindow('PutPixel / GetPixel demonstration');
  492.   StatusLine('Esc aborts or press a key...');
  493.  
  494.   GetViewSettings(ViewInfo);
  495.   with ViewInfo do
  496.   begin
  497.     XMax := (x2-x1-1);
  498.     YMax := (y2-y1-1);
  499.   end;
  500.  
  501.   while not KeyPressed do
  502.   begin
  503.     { Plot random pixels }
  504.     RandSeed := Seed;
  505.     I := 0;
  506.     while (not KeyPressed) and (I < NumPts) do
  507.     begin
  508.       Inc(I);
  509.         PutPixel(Random(XMax)+1, Random(YMax)+1, RandColor);
  510.     end;
  511.  
  512.     { Erase pixels }
  513.     RandSeed := Seed;
  514.     I := 0;
  515.     while (not KeyPressed) and (I < NumPts) do
  516.     begin
  517.       Inc(I);
  518.       X := Random(XMax)+1;
  519.       Y := Random(YMax)+1;
  520.       Color := GetPixel(X, Y);
  521.         if Color = RandColor then
  522.           PutPixel(X, Y, 0);
  523.      end;
  524.   end;
  525.   WaitToGo;
  526. end; { PutPixelPlay }
  527.  
  528. procedure PutImagePlay;
  529. { Demonstrate the GetImage and PutImage commands }
  530.  
  531. const
  532.   r  = 20;
  533.   StartX = 100;
  534.   StartY = 50;
  535.  
  536. var
  537.   CurPort : ViewPortType;
  538.  
  539. procedure MoveSaucer(var X, Y : integer; Width, Height : integer);
  540. var
  541.   Step : integer;
  542. begin
  543.   Step := Random(2*r);
  544.   if Odd(Step) then
  545.     Step := -Step;
  546.   X := X + Step;
  547.   Step := Random(r);
  548.   if Odd(Step) then
  549.     Step := -Step;
  550.   Y := Y + Step;
  551.  
  552.   { Make saucer bounce off viewport walls }
  553.   with CurPort do
  554.   begin
  555.     if (x1 + X + Width - 1 > x2) then
  556.       X := x2-x1 - Width + 1
  557.     else
  558.       if (X < 0) then
  559.         X := 0;
  560.     if (y1 + Y + Height - 1 > y2) then
  561.       Y := y2-y1 - Height + 1
  562.     else
  563.       if (Y < 0) then
  564.         Y := 0;
  565.   end;
  566. end; { MoveSaucer }
  567.  
  568. var
  569.   Pausetime : word;
  570.   Saucer    : pointer;
  571.   X, Y      : integer;
  572.   ulx, uly  : word;
  573.   lrx, lry  : word;
  574.   Size      : word;
  575.   I         : word;
  576. begin
  577.   ClearDevice;
  578.   FullPort;
  579.  
  580.   { PaintScreen }
  581.   ClearDevice;
  582.   MainWindow('GetImage / PutImage Demonstration');
  583.   StatusLine('Esc aborts or press a key...');
  584.   GetViewSettings(CurPort);
  585.  
  586.   { DrawSaucer }
  587.   Ellipse(StartX, StartY, 0, 360, r, (r div 3)+2);
  588.   Ellipse(StartX, StartY-4, 190, 357, r, r div 3);
  589.   Line(StartX+7, StartY-6, StartX+10, StartY-12);
  590.   Circle(StartX+10, StartY-12, 2);
  591.   Line(StartX-7, StartY-6, StartX-10, StartY-12);
  592.   Circle(StartX-10, StartY-12, 2);
  593.   SetFillStyle(SolidFill, MaxColor);
  594.   FloodFill(StartX+1, StartY+4, GetColor);
  595.  
  596.   { ReadSaucerImage }
  597.   ulx := StartX-(r+1);
  598.   uly := StartY-14;
  599.   lrx := StartX+(r+1);
  600.   lry := StartY+(r div 3)+3;
  601.  
  602.   Size := ImageSize(ulx, uly, lrx, lry);
  603.   GetMem(Saucer, Size);
  604.   GetImage(ulx, uly, lrx, lry, Saucer^);
  605. {  PutImage(ulx, uly, Saucer^, XORput);               { erase image }
  606.  
  607.   { Plot some "stars" }
  608.   for I := 1 to 1000 do
  609.      PutPixel(Random(MaxX), Random(MaxY), RandColor);
  610.   X := MaxX div 2;
  611.   Y := MaxY div 2;
  612.   PauseTime := 70;
  613.  
  614.   { Move the saucer around }
  615.   repeat
  616. {     PutImage(X, Y, Saucer^, XORput);                 { draw image }
  617.      Delay(PauseTime);
  618. {     PutImage(X, Y, Saucer^, XORput);                 { erase image }
  619.      MoveSaucer(X, Y, lrx - ulx + 1, lry - uly + 1);  { width/height }
  620.   until KeyPressed;
  621.   FreeMem(Saucer, size);
  622.   WaitToGo;
  623. end; { PutImagePlay }
  624.  
  625. procedure PolyPlay;
  626. { Draw random polygons with random fill styles on the screen }
  627. const
  628.   MaxPts = 5;
  629. type
  630.   PolygonType = array[1..MaxPts] of PointType;
  631. var
  632.   Poly : PolygonType;
  633.   I, Color : word;
  634. begin
  635.   MainWindow('FillPoly demonstration');
  636.   StatusLine('Esc aborts or press a key...');
  637.   repeat
  638.     Color := RandColor;
  639.     SetFillStyle(Random(11)+1, Color);
  640.     SetColor(Color);
  641.     for I := 1 to MaxPts do
  642.       with Poly[I] do
  643.       begin
  644.         X := Random(MaxX);
  645.         Y := Random(MaxY);
  646.       end;
  647.     FillPoly(MaxPts, Poly);
  648.   until KeyPressed;
  649.   WaitToGo;
  650. end; { PolyPlay }
  651.  
  652. procedure FillStylePlay;
  653. { Display all of the predefined fill styles available }
  654. var
  655.   Style    : word;
  656.   Width    : word;
  657.   Height   : word;
  658.   X, Y     : word;
  659.   I, J     : word;
  660.   ViewInfo : ViewPortType;
  661.  
  662. procedure DrawBox(X, Y : word);
  663. begin
  664.   SetFillStyle(Style, MaxColor);
  665.   with ViewInfo do
  666.     Bar(X, Y, X+Width, Y+Height);
  667.   Rectangle(X, Y, X+Width, Y+Height);
  668.   OutTextXY(X+(Width div 2), Y+Height+4, Int2Str(Style));
  669.   Inc(Style);
  670. end; { DrawBox }
  671.  
  672. begin
  673.   MainWindow('Pre-defined fill styles');
  674.   GetViewSettings(ViewInfo);
  675.   with ViewInfo do
  676.   begin
  677.     Width := 2 * ((x2+1) div 13);
  678.     Height := 2 * ((y2-10) div 10);
  679.   end;
  680.   X := Width div 2;
  681.   Y := Height div 2;
  682.   Style := 0;
  683.   for J := 1 to 3 do
  684.   begin
  685.     for I := 1 to 4 do
  686.     begin
  687.       DrawBox(X, Y);
  688.       Inc(X, (Width div 2) * 3);
  689.     end;
  690.     X := Width div 2;
  691.     Inc(Y, (Height div 2) * 3);
  692.   end;
  693.   SetTextJustify(LeftText, TopText);
  694.   WaitToGo;
  695. end; { FillStylePlay }
  696.  
  697. procedure FillPatternPlay;
  698. { Display some user defined fill patterns }
  699. const
  700.   Patterns : array[0..11] of FillPatternType = (
  701.   ($AA, $55, $AA, $55, $AA, $55, $AA, $55 üÖü üÖü  !BBäx!!!BBäx!BBäx"""DDêp""DDêp>"""BBääêp""!"BDäêêp>IÉÆ|      ° @≥î>00>><Dêx  !BBäx""DDêp&<"DDêê&22TTêêê$> $< @äêp>          ⁿBBBB<  @@Ç****DDDDDDDU¬U¬U¬U¬U¬U¬U¬▌w▌w▌w▌w▌w▌w▌w°°°≥■°°≥≥■≥≥■■°°°    ≤  ≤  ≤≤         °                     ≡≡≡≡≡≡≡≡≡≡≡≡≡≡       ;DDD;    $"Bdÿ>@@@>||>Ac]AAA1N"A""2,  `1NA"*III*<Bü üB<<BüüüB<A" \"QIE" < <BBBB  @@    ~ ?  @ÇB$$B ""A$$"AII6 üBr»$**IIII**ccregion.  The region is defined as any pixel of
  702.             OldColor which has a path of pixels of OldColor or NewColor
  703.             with sides touching back to the seed point, (XSeed, YSeed).
  704.             Therefore, only pixels of OldColor are modified and no other
  705.             information is changed.
  706.  
  707.             SEE ALSO
  708.  
  709.             DRWFILLBOX, DRWFILLCIRCLE, DRWFILLELLIPSE, FILLAREA,
  710.             FILLCONVEXPOLY, FILLPAGE, FILLPOLY, FILLSCREEN, FILLVIEW,
  711.             SETVIEW
  712.  
  713.             EXAMPL(HNxHHO$B<BBBB<$<BBBB<<BBBB<$BBBBBF:0BBBBF:$BBBF:B<""AAA""AAAAA"<B@@B<" <2\A">>xDDxDNDD <` <>BB= > <BBBB< BBBBF:2L\bBBBB&AaQIECA8$>""">0@@A>@@@ b$(. b$(*
  714.     $    $    $DDDDDDD¬U¬U¬U¬U¬U¬U¬Uw▌w▌w▌w▌w▌w▌w▌°°°⌠ⁿ°°⌠⌠ⁿ⌠⌠ⁿⁿ°°°    ≈  ≈  ≈≈         °                     ≡≡≡≡≡≡≡≡≡≡≡≡≡≡       7HH7"B\DBBRL~BB@@@@@@?R~!!~?DDDD8BBBB|@@Ç>P>III>"AA""AAA"Uw<DDDD86II6"EIQ"\ @@ "AAAAA> >     hH02L2L$$<H(,$<>>>>>>>         VMODE=VIDEOMODEGET
  715.             IF WHICHVGA = 0 THEN STOP
  716.             DUMMY=RES640
  717.             SETVIEW 100, 100, 539, 379
  718.             FILLVIEW 10
  719.             WHILE INKEY$ = ""
  720.             WEND
  721.             VIDEOMODESET VMODE
  722.             END
  723.  
  724.  
  725.  
  726.  
  727.  
  728.  
  729.  
  730.  
  731.  
  732.  
  733.  
  734.  
  735.  
  736.  
  737.  
  738.  
  739.                                                                          63
  740.  
  741.  
  742.  
  743.  
  744.  
  745.           FONTGETINFO
  746.  
  747.             PROTOTYPE
  748.  
  749.             SUB FONTGETINFO (Width%, Height%)
  750.  
  751.             INPUT
  752.  
  753.             no input parameters
  754.     WEND
  755.             MOUSEEXIT
  756.             VIDEOMODESET VMODE
  757.             END
  758.  
  759.  
  760.  
  761.  
  762.  
  763.  
  764.  
  765.  
  766.  
  767.  
  768.  
  769.  
  770.  
  771.  
  772.  
  773.  
  774.  
  775.  
  776.  
  777.  
  778.  
  779.  
  780.  
  781.  
  782.  
  783.  
  784.  
  785.  
  786.  
  787.  
  788.  
  789.  
  790.  
  791.  
  792.  
  793.  
  794.  
  795.  
  796.  
  797.  
  798.                                                                          86
  799.  
  800.  
  801.  
  802.  
  803.  
  804.           MOUSECURSORDEFAULT
  805.  
  806.             PROTOTYPE
  807.  
  808.             SUB MOUSECURSORDEFAULT ()
  809.  
  810.             INPUT
  811.  
  812.             no input parameters
  813.  
  814.             OUTPUT
  815.  
  816.             no value returned
  817.  
  818.             USAGE
  819.  
  820.             MOUSECURSORDEFAULT defines the mouse cursor to be a small
  821.        ,K$╖┼╘╤░XQ)σ┤ö≡÷┴─┤àñT┘,╘¬àñX9╘⌠àñ\9╘UÜ╢≤`9╘4a╘d9╘UTa╘h9╘ta╘l9╘Uöa╘p9╘┤a╘t┘PT±x┴îÇ╖0▓ïα│ÅαU┤ôα╡ùα╢¢α╖úΓ╘pǺΓ╕¡αë ╚┴πì°sKÉφb<$⌡▌ë     φë φë I1φë  Eφë $YφÆë (mφë ,üφë 0$òφë á⌐φë ñ╜φë I¿╤φë ¼σφë ░∙φÆë 4²ë ┤!²ë ╕$5²ë ╝I²ë └]²ë ⌐8q²ë <àⁿΦiǬ∙PÖÇ ¥Ç
  822. ⁿ░╨â@%8@ΓΦá╝╤░≡cÑÅ*$░╕≡ż≡τ╥m¿⌡ε    ╨@#µ≈$âh$âαra╨à`¥è∩Ç%Ç +─▀ TîcOî∩â°1<@  [$¿Ç¼ MMl·0ƒ Y¼─!%6a▐è ¥ì ßá+?±  P<îaTTV ╪iÇ¡≥░ `_ñ»%Çá᪠P█º»ε`éa∙É%H«┴íA%Gár∙É
  823. iw∙Éiφ`╧≥≡╤Çmⁿ▒
  824. ]ÆAáσw7░⌡∩    $·╟Ç√É&^`  ┐ $ⁿ  $■ $╒ nk$J-ÉQ1£PéBù »0αQ/Ñ4╜£░ºP≈Ñ4Ç⌡$(ª▀$@C]Æé≈└╕_SÇçÑ4=iÉ⌠ä╣<_np@Ñ45ò▒Y3ü¼Qí░.i>╠@5+┴╙É╛╙$@ #┴@«╦
  825. $╤
  826. #@Ñú4,p&e÷ü¼_ÇQºÑ4òQ  ü@;¡_áQ@e╠≥@mp!┤a╘O░√`Pñź ÇT°8ÿ!¼Åñ$½╙"q¿ PñCÇ¿α√└╥░eT"ß<p°%Pæ(╧%pδ¥/OêW0Ǽbφ φ B@[â¼8â≥µ≤(    ¿⌡%(Ç∩áTÿp+ óÜ▓0!Σ±(1±░┤ÖÇD└D0Å╡`   $ «îO@╧1
  827. a╝╤j-0ñ│`@╖bΦaT1═⌠╝╤Σ²¼±,1öíî9lÿ28ÇÅ`Γî¿P²$,N0┴O0a╫δ≤0σú`°î╖#0δ≡└X▄1»Σî(▒¥Ç█Ñ"qá√1CÇú╟╨º Å
  828. FT Θ²î└1ÇY0    w ²à░$@AÅ`╦Φ¼╘`▄1A  }┐Ç*5 ΩSδδî`¼îaδæ¼î5 1¿⌡Ω╜⌠ ¼¥╬ü└Qî1S╛≤î9╨iÇ,∙PU(}Ç$üÇ àÇ`σìÇ`QαÜBO$%ÿÇ╧"$Ç«Ç]É.┬\`%WÉ$  W0 ÄâO0]αG┬ur╩░£▒Q¢ú╔Ç≡°s?`X0╘`@ µWâ@╣aá εdq`¥9?Ç&+o0µyÄΣAÅuV(7P╬±@IdQ╕@Å┤@;Ç▓?Çò│CÇ┤╟╨╡KÇÄ30ⁿφ° ó╬ì+]Ä╦≡     Mö╝σ ²y5<!└▀óâ╝É3~mp    $<╛≤9Æ-2ⁿ≡@T,╞Σa,)Pæ└¥#¼╪Q┤S(¼@Aîa≡╤@Ö²±⌠KëD─┴▒▀0╨Ñ$╩-0 ╨ê*╙▓edm`î=3Kß-10è=≥≤²└£mîjy ÿe²ⁿ╨i╕e▓ΣmαÖ╢C%Ç*ê*0 EátQZ`mÄLP%    °üⁿªüNQ∙  T¿<qtWΩc z░ÅÇñΩçǪçÇ«;└<┐á¼¥. á?<Σscî)áí := 0;
  829.       end;
  830.     end;
  831.   end;
  832.   WaitToGo;
  833. end; { UserLineStylePlay }
  834.  
  835.  
  836. procedure SayGoodbye;
  837. { Say goodbye and then exit the program }
  838. var
  839.   ViewInfo : ViewPortType;
  840. begin
  841.   MainWindow('');
  842.   GetViewSettings(ViewInfo);
  843.   SetTextStyle(TriplexFont, HorizDir, 4);
  844.   SetTextJustify(CenterText, CenterText);
  845.   with ViewInfo do
  846.     OutTextXY((x2-x1) div 2, (y2-y1) div 2, 'That''s all folks!');
  847.   StatusLine('Press any key to quit...');
  848.   repeat until KeyPressed;
  849. end; { SayGoodbye }
  850.  
  851.  
  852. PROCEDURE SelectMode;
  853. VAR
  854.     choice1,choice2     : CHAR;
  855.    xsize,ysize            : WORD;
  856. BEGIN
  857.     (* Let's select a mode *)
  858.     ClrScr;
  859.     WriteLn('VESADEMO:');
  860.     WriteLn('1. 256 colors');
  861.     WriteLn('2. 32768 colors');
  862.     WriteLn('3. 65536 colors');
  863.     WriteLn('4. 16777216 colors');
  864.     WriteLn('Q uit');
  865.     WriteLn;
  866.     Write('Your choice: ');
  867.     REPEAT
  868.         ReadLn(choice1);
  869.       IF choice1 <> '1' THEN BEGIN
  870.           WriteLn('Sorry !');
  871.          WriteLn('This demo wasn''t written for more as 256 colors !');
  872.          WriteLn('You would only get a limited impression of the Hi-& TrueColor modes...');
  873.          WriteLn('Switching to 256 colors.');
  874.          choice1 := '1';
  875.       END;
  876.     UNTIL choice1 IN ['1'..'4','q'];
  877.     IF choice1 = 'q' THEN Halt;
  878.  
  879.     WriteLn;
  880.     WriteLn;
  881.     WriteLn('a. 320x200');
  882.     WriteLn('b. 640x480');
  883.     WriteLn('c. 800x600');
  884.     WriteLn('d. 1024x768');
  885.     WriteLn('e. 1280x1024');
  886.     WriteLn('Q uit');
  887.     WriteLn;
  888.     Write('Your choice: ');
  889.     REPEAT
  890.         ReadLn(choice2);
  891.     UNTIL choice2 IN ['a'..'e','q'];
  892.     IF choice2 = 'q' THEN Halt;
  893.  
  894.     CASE choice2 OF
  895.         'a' : BEGIN
  896.             xsize := 320;
  897.             ysize := 200;
  898.         END;
  899.         'b' : BEGIN
  900.             xsize := 640;
  901.             ysize := 480;
  902.         END;
  903.         'c' : BEGIN
  904.             xsize := 800;
  905.             ysize := 600;
  906.         END;
  907.         'd' : BEGIN
  908.             xsize := 1024;
  909.             ysize := 768;
  910.         END;
  911.         'e' : BEGIN
  912.             xsize := 1280;
  913.             ysize := 1024;
  914.         END;
  915.     END;
  916.     CASE choice1 OF
  917.         '1' : mode := FindVesaMode(xsize,ysize,8);
  918.         '2' : mode := FindVesaMode(xsize,ysize,15);
  919.         '3' : mode := FindVesaMode(xsize,ysize,16);
  920.         '4' : mode := FindVesaMode(xsize,ysize,24);
  921.     END;
  922.     IF mode = 0 THEN BEGIN
  923.         WriteLn('No such mode could be found !');
  924.         WriteLn('Switching to to 320x200.');
  925.         ReadKey;
  926.         mode := V320x200x256;
  927.     END;
  928. END;
  929.  
  930. begin { program body }
  931.   SelectMode;
  932.   Initialize;
  933.   ReportStatus;
  934.  
  935. {  AspectRatioPlay; }
  936.   FillEllipsePlay;
  937.   SectorPlay;
  938.   WriteModePlay;
  939.  
  940.   ColorPlay;
  941.   { PalettePlay only intended to work on these drivers: }
  942.   if (GraphDriver = EGA) or
  943.       (GraphDriver = EGA64) or
  944.       (GraphDriver = VGA) then
  945.      PalettePlay;
  946.   PutPixelPlay;
  947. {  PutImagePlay; }
  948.   RandBarPlay;
  949.   BarPlay;
  950.   Bar3DPlay;
  951.   ArcPlay;
  952.   CirclePlay;
  953.   PiePlay;
  954.   LineToPlay;
  955.   LineRelPlay;
  956. {  LineStylePlay; }
  957. {  UserLineStylePlay; }
  958.   TextDump;
  959.   TextPlay;
  960.   CrtModePlay;
  961.   FillStylePlay;
  962.   FillPatternPlay;
  963.   PolyPlay;
  964.   SayGoodbye;
  965. {  CloseGraph; }
  966.   CloseVesa;
  967. end.
  968. ***************************************************
  969.     '* SHOW D2ROTATE (ABOUT THE ORIGIN)
  970.     '****************************************************************∞╥≤c≤*φè#^│v/╒:j═φ0t+l▓ô"¬"g└≡?%ªêΣ│H╫½╫╜├¿U'╒⌐⌡ ßV?╩¬ujOΦçEZ1∞▐! ▄B╛Σ8║æ]1GlNÜ┐q▌▓;ô$ΦzE<cª*bEô#ä╧ñÅ"∩─LrdaÖ ╠º╫a^¥£å╬1~)@ëÖMδ╫0═6DäFê¬Çv┼ß╨kæpτ╪É)}ª 1w3╤╧ü⌡¥╓h▓╣≈ïÅaÑ[TⁿHqªÉ╝DKÄ─Y-∞tT╤Θ╨º╟╪.*ÇI9lΦ≈{πτcσ$τπßoFr╪╨∩┼╞╟;O2■e²LÜ4^N|╪½ÅO?╔°FOz`╟╟╟'<>>π$πΘù6·Xgî╖│°oîδπGƒd╝▀░?■╪╔_9L ⌡ôⁿq'æO▀ƒn4╔▀╚▄┼3pτ.òO°·}÷╕ⁿ±'æO?ít│!√8ßÑ≤/┐╣p┼≥┘E╦Vox╕cΦé5╟╚º╙$?√$≥ΘZεsî≡åìΓpKù¢ïß X╥ 9╞≈\µk┤O¥_ 5Üö\≤éÄ┌╤A[╤ÿáï┼éNⁿÅu16    g,%hc╙╨cD╨Vï┘R¢öKñR;8εáΣ╢╪ós╤π╡á└èxgzPÄMú╫yαºÉ+σJ¢i+▓â3╥    ═Ñ╙î^ºG▓█πérφçs %#(╗⌠?┼%u8≡6+QÉ))ò)Afw≈╣╪)B&4░åLXV:δät@Å.;5Φf╢Ät┐ΣJ╫─U8úÇ╟éö£╕p╔┴⌠vg╨╬╥é÷╪╣┬ΓI.ç≡^v╤ZΦÇ& ╒┌6ñô6XßNè╡╬E₧Ñ
  971. kIº╠▄A+╣╥éb²tæ-Y¡½αÑa═uuîÇ╢αêvhuª╡SÅ┤vèùú¥F;p<d⌐/F─d█éT%▓KΦû=q■öI┐ ┐╠6S$▒÷╚ENΩ¥Fû9╔┌R'╝ ╧φ└?g┬j▓0═/b╖₧─mûé╢┌»ÿÄë/·<éò■░╤╟╢├Xσ:╥P3Θ"╬Læsφ░┌öSö!╗¿*mN£WΣÇ£┤~#╗ææ≥RΩóh:à▌.æ≈╕▌v£äàd▒à╒├=░╖π║$howeg*╬    6ù▄ƒô╕φ░Ö╢qΘD>(w@úKεHÆ╛öúΣU
  972. éÜR╔╤W▄èê 2M%ó.▓SNÖA1ùJE╢║l]▓¿>\%└Å4ßO▄£â⌐& ê/)8vSP▀▓ôⁿææ√ü√ÑÄa⌠â╚4S╓╟P- ?Σá╕▓Næ*q╡UΘ▓≈^ñ·I.rúR&$Y^╚%è≡B┌≈Ceat
  973.     Color := RandColor;
  974.     SetColor(Color);
  975.     SetFillStyle(Random(CloseDotFill)+1, Color);
  976.     Bar3D(Random(MaxWidth), Random(MaxHeight),
  977.           Random(MaxWidth), Random(MaxHeight), 0, TopOff);
  978.   until KeyPressed;
  979.   WaitToGo;
  980. end; { RandBarPlay }
  981.  
  982. procedure ArcPlay;
  983. { Draw random arcs on the screen }
  984. var
  985.   MaxRadius : word;
  986.   EndAngle : word;
  987.   ArcInfo : ArcCoordsType;
  988. begin
  989.   MainWindow('Arc / GetArcCoords demonstration');
  990.   StatusLine('Esc aborts or press a key');
  991.   MaxRadius := MaxY div 10;
  992.   repeat
  993.     SetColor(RandColor);
  994.     EndAngle := Random(360);
  995.     SetLineStyle(SolidLn, 0, NormWidth);
  996.     Arc(Random(MaxX), Random(MaxY), Random(EndAngle), EndAngle, Random(MaxRadius));
  997.     GetArcCoords(ArcInfo);
  998.     with ArcInfo do
  999.     begin
  1000.       Line(X, Y, XStart, YStart);
  1001.       Line(X, Y, Xend, Yend);
  1002.     end;
  1003.   until KeyPressed;
  1004.   WaitToGo;
  1005. end; { ArcPlay }
  1006.  
  1007. procedure PutPixelPlay;
  1008. { Demonstrate the PutPixel and GetPixel commands }
  1009. const
  1010.   Seed   = 1962; { A seed for the random number generator }
  1011.   NumPts = 2000; { The number of pixels plotted }
  1012.   Esc    = #27;
  1013. var
  1014.   I : word;
  1015.   X, Y, Color : word;
  1016.   XMax, YMax  : integer;
  1017.   ViewInfo    : ViewPortType;
  1018. begin
  1019.   MainWindow('PutPixel / GetPixel demonstration');
  1020.   StatusLine('Esc aborts or press a key...');
  1021.  
  1022.   GetViewSettings(ViewInfo);
  1023.   with ViewInfo do
  1024.   begin
  1025.     XMax := (x2-x1-1);
  1026.     YMax := (y2-y1-1);
  1027.   end;
  1028.  
  1029.   while not KeyPressed do
  1030.   begin
  1031.     { Plot random pixels }
  1032.     RandSeed := Seed;
  1033.     I := 0;
  1034.     while (not KeyPressed) and (I < NumPts) do
  1035.     begin
  1036.       Inc(I);
  1037.         PutPixel(Random(XMax)+1, Random(YMax)+1, RandColor);
  1038.     end;
  1039.  
  1040.     { Erase pixels }
  1041.     RandSeed := Seed;
  1042.     I := 0;
  1043.     while (not KeyPressed) and (I < NumPts) do
  1044.     begin
  1045.       Inc(I);
  1046.       X := Random(XMax)+1;
  1047.       Y := Random(YMax)+1;
  1048.       Color := GetPixel(X, Y);
  1049.         if Color = RandColor then
  1050.           PutPixel(X, Y, 0);
  1051.      end;
  1052.   end;
  1053.   WaitToGo;
  1054. end; { PutPixelPlay }
  1055.  
  1056. procedure PutImagePlay;
  1057. { Demonstrate the GetImage and PutImage commands }
  1058.  
  1059. const
  1060.   r  = 20;
  1061.   StartX = 100;
  1062.   StartY = 50;
  1063.  
  1064. var
  1065.   CurPort : ViewPortType;
  1066.  
  1067. procedure MoveSaucer(var X, Y : integer; Width, Height : integer);
  1068. var
  1069.   Step : integer;
  1070. begin
  1071.   Step := Random(2*r);
  1072.   if Odd(Step) then
  1073.     Step := -Step;
  1074.   X := X + Step;
  1075.   Step := Random(r);
  1076.   if Odd(Step) then
  1077.     Step := -Step;
  1078.   Y := Y + Step;
  1079.  
  1080.   { Make saucer bounce off viewport walls }
  1081.   with CurPort do
  1082.   begin
  1083.     if (x1 + X + Width - 1 > x2) then
  1084.       X := x2-x1 - Width + 1
  1085.     else
  1086.       if (X < 0) then
  1087.         X := 0;
  1088.     if (y1 + Y + Height - 1 > y2) then
  1089.       Y := y2-y1 - Height + 1
  1090.     else
  1091.       if (Y < 0) then
  1092.         Y := 0;
  1093.   end;
  1094. end; { MoveSaucer }
  1095.  
  1096. var
  1097.   Pausetime : word;
  1098.   Saucer    : pointer;
  1099.   X, Y      : integer;
  1100.   ulx, uly  : word;
  1101.   lrx, lry  : word;
  1102.   Size      : word;
  1103.   I         : word;
  1104. begin
  1105.   ClearDevice;
  1106.   FullPort;
  1107.  
  1108.   { PaintScreen }
  1109.   ClearDevice;
  1110.   MainWindow('GetImage / PutImage Demonstration');
  1111.   StatusLine('Esc aborts or press a key...');
  1112.   GetViewSettings(CurPort);
  1113.  
  1114.   { DrawSaucer }
  1115.   Ellipse(StartX, StartY, 0, 360, r, (r div 3)+2);
  1116.   Ellipse(StartX, StartY-4, 190, 357, r, r div 3);
  1117.   Line(StartX+7, StartY-6, StartX+10, StartY-12);
  1118.   Circle(StartX+10, StartY-12, 2);
  1119.   Line(StartX-7, StartY-6, StartX-10, StartY-12);
  1120.   Circle(StartX-10, StartY-12, 2);
  1121.   SetFillStyle(SolidFill, MaxColor);
  1122.   FloodFill(StartX+1, StartY+4, GetColor);
  1123.  
  1124.   { ReadSaucerImage }
  1125.   ulx := StartX-(r+1);
  1126.   uly := StartY-14;
  1127.   lrx := StartX+(r+1);
  1128.   lry := StartY+(r div 3)+3;
  1129.  
  1130.   Size := ImageSize(ulx, uly, lrx, lry);
  1131.   GetMem(Saucer, Size);
  1132.   GetImage(ulx, uly, lrx, lry, Saucer^);
  1133. {  PutImage(ulx, uly, Saucer^, XORput);               { erase image }
  1134.  
  1135.   { Plot some "stars" }
  1136.   for I := 1 to 1000 do
  1137.      PutPixel(Random(MaxX), Random(MaxY), RandColor);
  1138.   X := MaxX div 2;
  1139.   Y := MaxY div 2;
  1140.   PauseTime := 70;
  1141.  
  1142.   { Move the saucer around }
  1143.   repeat
  1144. {     PutImage(X, Y, Saucer^, XORput);                 { draw image }
  1145.      Delay(PauseTime);
  1146. {     PutImage(X, Y, Saucer^, XORput);                 { erase image }
  1147.      MoveSaucer(X, Y, lrx - ulx + 1, lry - uly + 1);  { width/height }
  1148.   until KeyPressed;
  1149.   FreeMem(Saucer, size);
  1150.   WaitToGo;
  1151. end; { PutImagePlay }
  1152.  
  1153. procedure PolyPlay;
  1154. { Draw random polygons with random fill styles on the screen }
  1155. const
  1156.   MaxPts = 5;
  1157. type
  1158.   PolygonType = array[1..MaxPts] of PointType;
  1159. var
  1160.   Poly : PolygonType;
  1161.   I, Color : word;
  1162. begin
  1163.   MainWindow('FillPoly demonstration');
  1164.   StatusLine('Esc aborts or press a key...');
  1165.   repeat
  1166.     Color := RandColor;
  1167.     SetFillStyle(Random(11)+1, Color);
  1168.     SetColor(Color);
  1169.     for I := 1 to MaxPts do
  1170.       with Poly[I] do
  1171.       begin
  1172.         X := Random(MaxX);
  1173.         Y := Random(MaxY);
  1174.       end;
  1175.     FillPoly(MaxPts, Poly);
  1176.   until KeyPressed;
  1177.   WaitToGo;
  1178. end; { PolyPlay }
  1179.  
  1180. procedure FillStylePlay;
  1181. { Display all of the predefined fill styles available }
  1182. var
  1183.   Style    : word;
  1184.   Width    : word;
  1185.   Height   : word;
  1186.   X, Y     : word;
  1187.   I, J     : word;
  1188.   ViewInfo : ViewPortType;
  1189.  
  1190. procedure DrawBox(X, Y : word);
  1191. begin
  1192.   SetFillStyle(Style, MaxColor);
  1193.   with ViewInfo do
  1194.     Bar(X, Y, X+Width, Y+Height);
  1195.   Rectangle(X, Y, X+Width, Y+Height);
  1196.   OutTextXY(X+(Width div 2), Y+Height+4, Int2Str(Style));
  1197.   Inc(Style);
  1198. end; { DrawBox }
  1199.  
  1200. begin
  1201.   MainWindow('Pre-defined fill styles');
  1202.   GetViewSettings(ViewInfo);
  1203.   with ViewInfo do
  1204.   begin
  1205.     Width := 2 * ((x2+1) div 13);
  1206.     Height := 2 * ((y2-10) div 10);
  1207.   end;
  1208.   X := Width div 2;
  1209.   Y := Height div 2;
  1210.   Style := 0;
  1211.   for J := 1 to 3 do
  1212.   begin
  1213.     for I := 1 to 4 do
  1214.     begin
  1215.       DrawBox(X, Y);
  1216.       Inc(X, (Width div 2) * 3);
  1217.     end;
  1218.     X := Width div 2;
  1219.     Inc(Y, (Height div 2) * 3);
  1220.   end;
  1221.   SetTextJustify(LeftText, TopText);
  1222.   WaitToGo;
  1223. end; { FillStylePlay }
  1224.  
  1225. procedure FillPatternPlay;
  1226. { Display some user defined fill patterns }
  1227. const
  1228.   Patterns : array[0..11] of FillPatternType = (
  1229.   ($AA, $55, $AA, $55, $AA, $55, $AA, $55 üÖü üÖü  !BBäx!!!BBäx!BBäx"""DDêp""DDêp>"""BBääêp""!"BDäêêp>IÉÆ|      ° @≥î>00>><Dêx  !BBäx""DDêp&<"DDêê&22TTêêê$> $< @äêp>          ⁿBBBB<  @@Ç****DDDDDDDU¬U¬U¬U¬U¬U¬U¬▌w▌w▌w▌w▌w▌w▌w°°°≥■°°≥≥■≥≥■■°°°    ≤  ≤  ≤≤         °                     ≡≡≡≡≡≡≡≡≡≡≡≡≡≡       ;DDD;    $"Bdÿ>@@@>||>Ac]AAA1N"A""2,  `1NA"*III*<Bü üB<<BüüüB<A" \"QIE" < <BBBB  @@    ~ ?  @ÇB$$B ""A$$"AII6 üBr»$**IIII**ccregion.  The region is defined as any pixel of
  1230.             OldColor which has a path of pixels of OldColor or NewColor
  1231.             with sides touching back to the seed point, (XSeed, YSeed).
  1232.             Therefore, only pixels of OldColor are modified and no other
  1233.             information is changed.
  1234.  
  1235.             SEE ALSO
  1236.  
  1237.             DRWFILLBOX, DRWFILLCIRCLE, DRWFILLELLIPSE, FILLAREA,
  1238.             FILLCONVEXPOLY, FILLPAGE, FILLPOLY, FILLSCREEN, FILLVIEW,
  1239.             SETVIEW
  1240.  
  1241.             EXAMPL(HNxHHO$B<BBBB<$<BBBB<<BBBB<$BBBBBF:0BBBBF:$BBBF:B<""AAA""AAAAA"<B@@B<" <2\A">>xDDxDNDD <` <>BB= > <BBBB< BBBBF:2L\bBBBB&AaQIECA8$>""">0@@A>@@@ b$(. b$(*
  1242.     $    $    $DDDDDDD¬U¬U¬U¬U¬U¬U¬Uw▌w▌w▌w▌w▌w▌w▌°°°⌠ⁿ°°⌠⌠ⁿ⌠⌠ⁿⁿ°°°    ≈  ≈  ≈≈         °                     ≡≡≡≡≡≡≡≡≡≡≡≡≡≡       7HH7"B\DBBRL~BB@@@@@@?R~!!~?DDDD8BBBB|@@Ç>P>III>"AA""AAA"Uw<DDDD86II6"EIQ"\ @@ "AAAAA> >     hH02L2L$$<H(,$<>>>>>>>         VMODE=VIDEOMODEGET
  1243.             IF WHICHVGA = 0 THEN STOP
  1244.             DUMMY=RES640
  1245.             SETVIEW 100, 100, 539, 379
  1246.             FILLVIEW 10
  1247.             WHILE INKEY$ = ""
  1248.             WEND
  1249.             VIDEOMODESET VMODE
  1250.             END
  1251.  
  1252.  
  1253.  
  1254.  
  1255.  
  1256.  
  1257.  
  1258.  
  1259.  
  1260.  
  1261.  
  1262.  
  1263.  
  1264.  
  1265.  
  1266.  
  1267.                                                                          63
  1268.  
  1269.  
  1270.  
  1271.  
  1272.  
  1273.           FONTGETINFO
  1274.  
  1275.             PROTOTYPE
  1276.  
  1277.             SUB FONTGETINFO (Width%, Height%)
  1278.  
  1279.             INPUT
  1280.  
  1281.             no input parameters
  1282.     WEND
  1283.             MOUSEEXIT
  1284.             VIDEOMODESET VMODE
  1285.             END
  1286.  
  1287.  
  1288.  
  1289.  
  1290.  
  1291.  
  1292.  
  1293.  
  1294.  
  1295.  
  1296.  
  1297.  
  1298.  
  1299.  
  1300.  
  1301.  
  1302.  
  1303.  
  1304.  
  1305.  
  1306.  
  1307.  
  1308.  
  1309.  
  1310.  
  1311.  
  1312.  
  1313.  
  1314.  
  1315.  
  1316.  
  1317.  
  1318.  
  1319.  
  1320.  
  1321.  
  1322.  
  1323.  
  1324.  
  1325.  
  1326.                                                                          86
  1327.  
  1328.  
  1329.  
  1330.  
  1331.  
  1332.           MOUSECURSORDEFAULT
  1333.  
  1334.             PROTOTYPE
  1335.  
  1336.             SUB MOUSECURSORDEFAULT ()
  1337.  
  1338.             INPUT
  1339.  
  1340.             no input parameters
  1341.  
  1342.             OUTPUT
  1343.  
  1344.             no value returned
  1345.  
  1346.             USAGE
  1347.  
  1348.             MOUSECURSORDEFAULT defines the mouse cursor to be a small
  1349.        ,K$╖┼╘╤░XQ)σ┤ö≡÷┴─┤àñT┘,╘¬àñX9╘⌠àñ\9╘UÜ╢≤`9╘4a╘d9╘UTa╘h9╘ta╘l9╘Uöa╘p9╘┤a╘t┘PT±x┴îÇ╖0▓ïα│ÅαU┤ôα╡ùα╢¢α╖úΓ╘pǺΓ╕¡αë ╚┴πì°sKÉφb<$⌡▌ë     φë φë I1φë  Eφë $YφÆë (mφë ,üφë 0$òφë á⌐φë ñ╜φë I¿╤φë ¼σφë ░∙φÆë 4²ë ┤!²ë ╕$5²ë ╝I²ë └]²ë ⌐8q²ë <àⁿΦiǬ∙PÖÇ ¥Ç
  1350. ⁿ░╨â@%8@ΓΦá╝╤░≡cÑÅ*$░╕≡ż≡τ╥m¿⌡ε    ╨@#µ≈$âh$âαra╨à`¥è∩Ç%Ç +─▀ TîcOî∩â°1<@  [$¿Ç¼ MMl·0ƒ Y¼─!%6a▐è ¥ì ßá+?±  P<îaTTV ╪iÇ¡≥░ `_ñ»%Çá᪠P█º»ε`éa∙É%H«┴íA%Gár∙É
  1351. iw∙Éiφ`╧≥≡╤Çmⁿ▒
  1352. ]ÆAáσw7░⌡∩    $·╟Ç√É&^`  ┐ $ⁿ  $■ $╒ nk$J-ÉQ1£PéBù »0αQ/Ñ4╜£░ºP≈Ñ4Ç⌡$(ª▀$@C]Æé≈└╕_SÇçÑ4=iÉ⌠ä╣<_np@Ñ45ò▒Y3ü¼Qí░.i>╠@5+┴╙É╛╙$@ #┴@«╦
  1353. $╤
  1354. #@Ñú4,p&e÷ü¼_ÇQºÑ4òQ  ü@;¡_áQ@e╠≥@mp!┤a╘O░√`Pñź ÇT°8ÿ!¼Åñ$½╙"q¿ PñCÇ¿α√└╥░eT"ß<p°%Pæ(╧%pδ¥/OêW0Ǽbφ φ B@[â¼8â≥µ≤(    ¿⌡%(Ç∩áTÿp+ óÜ▓0!Σ±(1±░┤ÖÇD└D0Å╡`   $ «îO@╧1
  1355. a╝╤j-0ñ│`@╖bΦaT1═⌠╝╤Σ²¼±,1öíî9lÿ28ÇÅ`Γî¿P²$,N0┴O0a╫δ≤0σú`°î╖#0δ≡└X▄1»Σî(▒¥Ç█Ñ"qá√1CÇú╟╨º Å
  1356. FT Θ²î└1ÇY0    w ²à░$@AÅ`╦Φ¼╘`▄1A  }┐Ç*5 ΩSδδî`¼îaδæ¼î5 1¿⌡Ω╜⌠ ¼¥╬ü└Qî1S╛≤î9╨iÇ,∙PU(}Ç$üÇ àÇ`σìÇ`QαÜBO$%ÿÇ╧"$Ç«Ç]É.┬\`%WÉ$  W0 ÄâO0]αG┬ur╩░£▒Q¢ú╔Ç≡°s?`X0╘`@ µWâ@╣aá εdq`¥9?Ç&+o0µyÄΣAÅuV(7P╬±@IdQ╕@Å┤@;Ç▓?Çò│CÇ┤╟╨╡KÇÄ30ⁿφ° ó╬ì+]Ä╦≡     Mö╝σ ²y5<!└▀óâ╝É3~mp    $<╛≤9Æ-2ⁿ≡@T,╞Σa,)Pæ└¥#¼╪Q┤S(¼@Aîa≡╤@Ö²±⌠KëD─┴▒▀0╨Ñ$╩-0 ╨ê*╙▓edm`î=3Kß-10è=≥≤²└£mîjy ÿe²ⁿ╨i╕e▓ΣmαÖ╢C%Ç*ê*0 EátQZ`mÄLP%    °üⁿªüNQ∙  T¿<qtWΩc z░ÅÇñΩçǪçÇ«;└<┐á¼¥. á?<Σscî)áí := 0;
  1357.       end;
  1358.     end;
  1359.   end;
  1360.   WaitToGo;
  1361. end; { UserLineStylePlay }
  1362.  
  1363.  
  1364. procedure SayGoodbye;
  1365. { Say goodbye and then exit the program }
  1366. var
  1367.   ViewInfo : ViewPortType;
  1368. begin
  1369.   MainWindow('');
  1370.   GetViewSettings(ViewInfo);
  1371.   SetTextStyle(TriplexFont, HorizDir, 4);
  1372.   SetTextJustify(CenterText, CenterText);
  1373.   with ViewInfo do
  1374.     OutTextXY((x2-x1) div 2, (y2-y1) div 2, 'That''s all folks!');
  1375.   StatusLine('Press any key to quit...');
  1376.   repeat until KeyPressed;
  1377. end; { SayGoodbye }
  1378.  
  1379.  
  1380. PROCEDURE SelectMode;
  1381. VAR
  1382.     choice1,choice2     : CHAR;
  1383.    xsize,ysize            : WORD;
  1384. BEGIN
  1385.     (* Let's select a mode *)
  1386.     ClrScr;
  1387.     WriteLn('VESADEMO:');
  1388.     WriteLn('1. 256 colors');
  1389.     WriteLn('2. 32768 colors');
  1390.     WriteLn('3. 65536 colors');
  1391.     WriteLn('4. 16777216 colors');
  1392.     WriteLn('Q uit');
  1393.     WriteLn;
  1394.     Write('Your choice: ');
  1395.     REPEAT
  1396.         ReadLn(choice1);
  1397.       IF choice1 <> '1' THEN BEGIN
  1398.           WriteLn('Sorry !');
  1399.          WriteLn('This demo wasn''t written for more as 256 colors !');
  1400.          WriteLn('You would only get a limited impression of the Hi-& TrueColor modes...');
  1401.          WriteLn('Switching to 256 colors.');
  1402.          choice1 := '1';
  1403.       END;
  1404.     UNTIL choice1 IN ['1'..'4','q'];
  1405.     IF choice1 = 'q' THEN Halt;
  1406.  
  1407.     WriteLn;
  1408.     WriteLn;
  1409.     WriteLn('a. 320x200');
  1410.     WriteLn('b. 640x480');
  1411.     WriteLn('c. 800x600');
  1412.     WriteLn('d. 1024x768');
  1413.     WriteLn('e. 1280x1024');
  1414.     WriteLn('Q uit');
  1415.     WriteLn;
  1416.     Write('Your choice: ');
  1417.     REPEAT
  1418.         ReadLn(choice2);
  1419.     UNTIL choice2 IN ['a'..'e','q'];
  1420.     IF choice2 = 'q' THEN Halt;
  1421.  
  1422.     CASE choice2 OF
  1423.         'a' : BEGIN
  1424.             xsize := 320;
  1425.             ysize := 200;
  1426.         END;
  1427.         'b' : BEGIN
  1428.             xsize := 640;
  1429.             ysize := 480;
  1430.         END;
  1431.         'c' : BEGIN
  1432.             xsize := 800;
  1433.             ysize := 600;
  1434.         END;
  1435.         'd' : BEGIN
  1436.             xsize := 1024;
  1437.             ysize := 768;
  1438.         END;
  1439.         'e' : BEGIN
  1440.             xsize := 1280;
  1441.             ysize := 1024;
  1442.         END;
  1443.     END;
  1444.     CASE choice1 OF
  1445.         '1' : mode := FindVesaMode(xsize,ysize,8);
  1446.         '2' : mode := FindVesaMode(xsize,ysize,15);
  1447.         '3' : mode := FindVesaMode(xsize,ysize,16);
  1448.         '4' : mode := FindVesaMode(xsize,ysize,24);
  1449.     END;
  1450.     IF mode = 0 THEN BEGIN
  1451.         WriteLn('No such mode could be found !');
  1452.         WriteLn('Switching to to 320x200.');
  1453.         ReadKey;
  1454.         mode := V320x200x256;
  1455.     END;
  1456. END;
  1457.  
  1458. begin { program body }
  1459.   SelectMode;
  1460.   Initialize;
  1461.   ReportStatus;
  1462.  
  1463. {  AspectRatioPlay; }
  1464.   FillEllipsePlay;
  1465.   SectorPlay;
  1466.   WriteModePlay;
  1467.  
  1468.   ColorPlay;
  1469.   { PalettePlay only intended to work on these drivers: }
  1470.   if (GraphDriver = EGA) or
  1471.       (GraphDriver = EGA64) or
  1472.       (GraphDriver = VGA) then
  1473.      PalettePlay;
  1474.   PutPixelPlay;
  1475. {  PutImagePlay; }
  1476.   RandBarPlay;
  1477.   BarPlay;
  1478.   Bar3DPlay;
  1479.   ArcPlay;
  1480.   CirclePlay;
  1481.   PiePlay;
  1482.   LineToPlay;
  1483.   LineRelPlay;
  1484. {  LineStylePlay; }
  1485. {  UserLineStylePlay; }
  1486.   TextDump;
  1487.   TextPlay;
  1488.   CrtModePlay;
  1489.   FillStylePlay;
  1490.   FillPatternPlay;
  1491.   PolyPlay;
  1492.   SayGoodbye;
  1493. {  CloseGraph; }
  1494.   CloseVesa;
  1495. end.
  1496. ***************************************************
  1497.     '* SHOW D2ROTATE (ABOUT THE ORIGIN)
  1498.     '****************************************************************∞╥≤c≤*φè#^│v/╒:j═φ0t+l▓ô"¬"g└≡?%ªêΣ│H╫½╫╜├¿U'╒⌐⌡ ßV?╩¬ujOΦçEZ1∞▐! ▄B╛Σ8║æ]1GlNÜ┐q▌▓;ô$ΦzE<cª*bEô#ä╧ñÅ"∩─LrdaÖ ╠º╫a^¥£å╬1~)@ëÖMδ╫0═6DäFê¬Çv┼ß╨kæpτ╪É)}ª 1w3╤╧ü⌡¥╓h▓╣≈ïÅaÑ[TⁿHqªÉ╝DKÄ─Y-∞tT╤Θ╨º╟╪.*ÇI9lΦ≈{πτcσ$τπßoFr╪╨∩┼╞╟;O2■e²LÜ4^N|╪½ÅO?╔°FOz`╟╟╟'<>>π$πΘù6·Xgî╖│°oîδπGƒd╝▀░?■╪╔_9L ⌡ôⁿq'æO▀ƒn4╔▀╚▄┼3pτ.òO°·}÷╕ⁿ±'æO?ít│!√8ßÑ≤/┐╣p┼≥┘E╦Vox╕cΦé5╟╚º╙$?√$≥ΘZεsî≡åìΓpKù¢ïß X╥ 9╞≈\µk┤O¥_ 5Üö\≤éÄ┌╤A[╤ÿáï┼éNⁿÅu16    g,%hc╙╨cD╨Vï┘R¢öKñR;8εáΣ╢╪ós╤π╡á└èxgzPÄMú╫yαºÉ+σJ¢i+▓â3╥    ═Ñ╙î^ºG▓█πérφçs %#(╗⌠?┼%u8≡6+QÉ))ò)Afw≈╣╪)B&4░åLXV:δät@Å.;5Φf╢Ät┐ΣJ╫─U8úÇ╟éö£╕p╔┴⌠vg╨╬╥é÷╪╣┬ΓI.ç≡^v╤ZΦÇ& ╒┌6ñô6XßNè╡╬E₧Ñ
  1499. kIº╠▄A+╣╥éb²tæ-Y¡½αÑa═uuîÇ╢αêvhuª╡SÅ┤vèùú¥F;p<d⌐/F─d█éT%▓KΦû=q■öI┐ ┐╠6S$▒÷╚ENΩ¥Fû9╔┌R'╝ ╧φ└?g┬j▓0═/b╖₧─mûé╢┌»ÿÄë/·<éò■░╤╟╢├Xσ:╥P3Θ"╬Læsφ░┌öSö!╗¿*mN£WΣÇ£┤~#╗ææ≥RΩóh:à▌.æ≈╕▌v£äàd▒à╒├=░╖π║$howeg*╬    6ù▄ƒô╕φ░Ö╢qΘD>(w@úKεHÆ╛öúΣU
  1500. éÜR╔╤W▄èê 2M%ó.▓SNÖA1ùJE╢║l]▓¿>\%└Å4ßO▄£â⌐& ê/)8vSP▀▓ôⁿææ√ü√ÑÄa⌠â╚4S╓╟P- ?Σá╕▓Næ*q╡UΘ▓≈^ñ·I.rúR&$Y^╚%è≡B┌≈Ceat
  1501.     Color := RandColor;
  1502.     SetColor(Color);
  1503.     SetFillStyle(Random(CloseDotFill)+1, Color);
  1504.     Bar3D(Random(MaxWidth), Random(MaxHeight),
  1505.           Random(MaxWidth), Random(MaxHeight), 0, TopOff);
  1506.   until KeyPressed;
  1507.   WaitToGo;
  1508. end; { RandBarPlay }
  1509.  
  1510. procedure ArcPlay;
  1511. { Draw random arcs on the screen }
  1512. var
  1513.   MaxRadius : word;
  1514.   EndAngle : word;
  1515.   ArcInfo : ArcCoordsType;
  1516. begin
  1517.   MainWindow('Arc / GetArcCoords demonstration');
  1518.   StatusLine('Esc aborts or press a key');
  1519.   MaxRadius := MaxY div 10;
  1520.   repeat
  1521.     SetColor(RandColor);
  1522.     EndAngle := Random(360);
  1523.     SetLineStyle(SolidLn, 0, NormWidth);
  1524.     Arc(Random(MaxX), Random(MaxY), Random(EndAngle), EndAngle, Random(MaxRadius));
  1525.     GetArcCoords(ArcInfo);
  1526.     with ArcInfo do
  1527.     begin
  1528.       Line(X, Y, XStart, YStart);
  1529.       Line(X, Y, Xend, Yend);
  1530.     end;
  1531.   until KeyPressed;
  1532.   WaitToGo;
  1533. end; { ArcPlay }
  1534.  
  1535. procedure PutPixelPlay;
  1536. { Demonstrate the PutPixel and GetPixel commands }
  1537. const
  1538.   Seed   = 1962; { A seed for the random number generator }
  1539.   NumPts = 2000; { The number of pixels plotted }
  1540.   Esc    = #27;
  1541. var
  1542.   I : word;
  1543.   X, Y, Color : word;
  1544.   XMax, YMax  : integer;
  1545.   ViewInfo    : ViewPortType;
  1546. begin
  1547.   MainWindow('PutPixel / GetPixel demonstration');
  1548.   StatusLine('Esc aborts or press a key...');
  1549.  
  1550.   GetViewSettings(ViewInfo);
  1551.   with ViewInfo do
  1552.   begin
  1553.     XMax := (x2-x1-1);
  1554.     YMax := (y2-y1-1);
  1555.   end;
  1556.  
  1557.   while not KeyPressed do
  1558.   begin
  1559.     { Plot random pixels }
  1560.     RandSeed := Seed;
  1561.     I := 0;
  1562.     while (not KeyPressed) and (I < NumPts) do
  1563.     begin
  1564.       Inc(I);
  1565.         PutPixel(Random(XMax)+1, Random(YMax)+1, RandColor);
  1566.     end;
  1567.  
  1568.     { Erase pixels }
  1569.     RandSeed := Seed;
  1570.     I := 0;
  1571.     while (not KeyPressed) and (I < NumPts) do
  1572.     begin
  1573.       Inc(I);
  1574.       X := Random(XMax)+1;
  1575.       Y := Random(YMax)+1;
  1576.       Color := GetPixel(X, Y);
  1577.         if Color = RandColor then
  1578.           PutPixel(X, Y, 0);
  1579.      end;
  1580.   end;
  1581.   WaitToGo;
  1582. end; { PutPixelPlay }
  1583.  
  1584. procedure PutImagePlay;
  1585. { Demonstrate the GetImage and PutImage commands }
  1586.  
  1587. const
  1588.   r  = 20;
  1589.   StartX = 100;
  1590.   StartY = 50;
  1591.  
  1592. var
  1593.   CurPort : ViewPortType;
  1594.  
  1595. procedure MoveSaucer(var X, Y : integer; Width, Height : integer);
  1596. var
  1597.   Step : integer;
  1598. begin
  1599.   Step := Random(2*r);
  1600.   if Odd(Step) then
  1601.     Step := -Step;
  1602.   X := X + Step;
  1603.   Step := Random(r);
  1604.   if Odd(Step) then
  1605.     Step := -Step;
  1606.   Y := Y + Step;
  1607.  
  1608.   { Make saucer bounce off viewport walls }
  1609.   with CurPort do
  1610.   begin
  1611.     if (x1 + X + Width - 1 > x2) then
  1612.       X := x2-x1 - Width + 1
  1613.     else
  1614.       if (X < 0) then
  1615.         X := 0;
  1616.     if (y1 + Y + Height - 1 > y2) then
  1617.       Y := y2-y1 - Height + 1
  1618.     else
  1619.       if (Y < 0) then
  1620.         Y := 0;
  1621.   end;
  1622. end; { MoveSaucer }
  1623.  
  1624. var
  1625.   Pausetime : word;
  1626.   Saucer    : pointer;
  1627.   X, Y      : integer;
  1628.   ulx, uly  : word;
  1629.   lrx, lry  : word;
  1630.   Size      : word;
  1631.   I         : word;
  1632. begin
  1633.   ClearDevice;
  1634.   FullPort;
  1635.  
  1636.   { PaintScreen }
  1637.   ClearDevice;
  1638.   MainWindow('GetImage / PutImage Demonstration');
  1639.   StatusLine('Esc aborts or press a key...');
  1640.   GetViewSettings(CurPort);
  1641.  
  1642.   { DrawSaucer }
  1643.   Ellipse(StartX, StartY, 0, 360, r, (r div 3)+2);
  1644.   Ellipse(StartX, StartY-4, 190, 357, r, r div 3);
  1645.   Line(StartX+7, StartY-6, StartX+10, StartY-12);
  1646.   Circle(StartX+10, StartY-12, 2);
  1647.   Line(StartX-7, StartY-6, StartX-10, StartY-12);
  1648.   Circle(StartX-10, StartY-12, 2);
  1649.   SetFillStyle(SolidFill, MaxColor);
  1650.   FloodFill(StartX+1, StartY+4, GetColor);
  1651.  
  1652.   { ReadSaucerImage }
  1653.   ulx := StartX-(r+1);
  1654.   uly := StartY-14;
  1655.   lrx := StartX+(r+1);
  1656.   lry := StartY+(r div 3)+3;
  1657.  
  1658.   Size := ImageSize(ulx, uly, lrx, lry);
  1659.   GetMem(Saucer, Size);
  1660.   GetImage(ulx, uly, lrx, lry, Saucer^);
  1661. {  PutImage(ulx, uly, Saucer^, XORput);               { erase image }
  1662.  
  1663.   { Plot some "stars" }
  1664.   for I := 1 to 1000 do
  1665.      PutPixel(Random(MaxX), Random(MaxY), RandColor);
  1666.   X := MaxX div 2;
  1667.   Y := MaxY div 2;
  1668.   PauseTime := 70;
  1669.  
  1670.   { Move the saucer around }
  1671.   repeat
  1672. {     PutImage(X, Y, Saucer^, XORput);                 { draw image }
  1673.      Delay(PauseTime);
  1674. {     PutImage(X, Y, Saucer^, XORput);                 { erase image }
  1675.      MoveSaucer(X, Y, lrx - ulx + 1, lry - uly + 1);  { width/height }
  1676.   until KeyPressed;
  1677.   FreeMem(Saucer, size);
  1678.   WaitToGo;
  1679. end; { PutImagePlay }
  1680.  
  1681. procedure PolyPlay;
  1682. { Draw random polygons with random fill styles on the screen }
  1683. const
  1684.   MaxPts = 5;
  1685. type
  1686.   PolygonType = array[1..MaxPts] of PointType;
  1687. var
  1688.   Poly : PolygonType;
  1689.   I, Color : word;
  1690. begin
  1691.   MainWindow('FillPoly demonstration');
  1692.   StatusLine('Esc aborts or press a key...');
  1693.   repeat
  1694.     Color := RandColor;
  1695.     SetFillStyle(Random(11)+1, Color);
  1696.     SetColor(Color);
  1697.     for I := 1 to MaxPts do
  1698.       with Poly[I] do
  1699.       begin
  1700.         X := Random(MaxX);
  1701.         Y := Random(MaxY);
  1702.       end;
  1703.     FillPoly(MaxPts, Poly);
  1704.   until KeyPressed;
  1705.   WaitToGo;
  1706. end; { PolyPlay }
  1707.  
  1708. procedure FillStylePlay;
  1709. { Display all of the predefined fill styles available }
  1710. var
  1711.   Style    : word;
  1712.   Width    : word;
  1713.   Height   : word;
  1714.   X, Y     : word;
  1715.   I, J     : word;
  1716.   ViewInfo : ViewPortType;
  1717.  
  1718. procedure DrawBox(X, Y : word);
  1719. begin
  1720.   SetFillStyle(Style, MaxColor);
  1721.   with ViewInfo do
  1722.     Bar(X, Y, X+Width, Y+Height);
  1723.   Rectangle(X, Y, X+Width, Y+Height);
  1724.   OutTextXY(X+(Width div 2), Y+Height+4, Int2Str(Style));
  1725.   Inc(Style);
  1726. end; { DrawBox }
  1727.  
  1728. begin
  1729.   MainWindow('Pre-defined fill styles');
  1730.   GetViewSettings(ViewInfo);
  1731.   with ViewInfo do
  1732.   begin
  1733.     Width := 2 * ((x2+1) div 13);
  1734.     Height := 2 * ((y2-10) div 10);
  1735.   end;
  1736.   X := Width div 2;
  1737.   Y := Height div 2;
  1738.   Style := 0;
  1739.   for J := 1 to 3 do
  1740.   begin
  1741.     for I := 1 to 4 do
  1742.     begin
  1743.       DrawBox(X, Y);
  1744.       Inc(X, (Width div 2) * 3);
  1745.     end;
  1746.     X := Width div 2;
  1747.     Inc(Y, (Height div 2) * 3);
  1748.   end;
  1749.   SetTextJustify(LeftText, TopText);
  1750.   WaitToGo;
  1751. end; { FillStylePlay }
  1752.  
  1753. procedure FillPatternPlay;
  1754. { Display some user defined fill patterns }
  1755. const
  1756.   Patterns : array[0..11] of FillPatternType = (
  1757.   ($AA, $55, $AA, $55, $AA, $55, $AA, $55 üÖü üÖü  !BBäx!!!BBäx!BBäx"""DDêp""DDêp>"""BBääêp""!"BDäêêp>IÉÆ|      ° @≥î>00>><Dêx  !BBäx""DDêp&<"DDêê&22TTêêê$> $< @äêp>          ⁿBBBB<  @@Ç****DDDDDDDU¬U¬U¬U¬U¬U¬U¬▌w▌w▌w▌w▌w▌w▌w°°°≥■°°≥≥■≥≥■■°°°    ≤  ≤  ≤≤         °                     ≡≡≡≡≡≡≡≡≡≡≡≡≡≡       ;DDD;    $"Bdÿ>@@@>||>Ac]AAA1N"A""2,  `1NA"*III*<Bü üB<<BüüüB<A" \"QIE" < <BBBB  @@    ~ ?  @ÇB$$B ""A$$"AII6 üBr»$**IIII**ccregion.  The region is defined as any pixel of
  1758.             OldColor which has a path of pixels of OldColor or NewColor
  1759.             with sides touching back to the seed point, (XSeed, YSeed).
  1760.             Therefore, only pixels of OldColor are modified and no other
  1761.             information is changed.
  1762.  
  1763.             SEE ALSO
  1764.  
  1765.             DRWFILLBOX, DRWFILLCIRCLE, DRWFILLELLIPSE, FILLAREA,
  1766.             FILLCONVEXPOLY, FILLPAGE, FILLPOLY, FILLSCREEN, FILLVIEW,
  1767.             SETVIEW
  1768.  
  1769.             EXAMPL(HNxHHO$B<BBBB<$<BBBB<<BBBB<$BBBBBF:0BBBBF:$BBBF:B<""AAA""AAAAA"<B@@B<" <2\A">>xDDxDNDD <` <>BB= > <BBBB< BBBBF:2L\bBBBB&AaQIECA8$>""">0@@A>@@@ b$(. b$(*
  1770.     $    $    $DDDDDDD¬U¬U¬U¬U¬U¬U¬Uw▌w▌w▌w▌w▌w▌w▌°°°⌠ⁿ°°⌠⌠ⁿ⌠⌠ⁿⁿ°°°    ≈  ≈  ≈≈         °                     ≡≡≡≡≡≡≡≡≡≡≡≡≡≡       7HH7"B\DBBRL~BB@@@@@@?R~!!~?DDDD8BBBB|@@Ç>P>III>"AA""AAA"Uw<DDDD86II6"EIQ"\ @@ "AAAAA> >     hH02L2L$$<H(,$<>>>>>>>         VMODE=VIDEOMODEGET
  1771.             IF WHICHVGA = 0 THEN STOP
  1772.             DUMMY=RES640
  1773.             SETVIEW 100, 100, 539, 379
  1774.             FILLVIEW 10
  1775.             WHILE INKEY$ = ""
  1776.             WEND
  1777.             VIDEOMODESET VMODE
  1778.             END
  1779.  
  1780.  
  1781.  
  1782.  
  1783.  
  1784.  
  1785.  
  1786.  
  1787.  
  1788.  
  1789.  
  1790.  
  1791.  
  1792.  
  1793.  
  1794.  
  1795.                                                                          63
  1796.  
  1797.  
  1798.  
  1799.  
  1800.  
  1801.           FONTGETINFO
  1802.  
  1803.             PROTOTYPE
  1804.  
  1805.             SUB FONTGETINFO (Width%, Height%)
  1806.  
  1807.             INPUT
  1808.  
  1809.             no input parameters
  1810.     WEND
  1811.             MOUSEEXIT
  1812.             VIDEOMODESET VMODE
  1813.             END
  1814.  
  1815.  
  1816.  
  1817.  
  1818.  
  1819.  
  1820.  
  1821.  
  1822.  
  1823.  
  1824.  
  1825.  
  1826.  
  1827.  
  1828.  
  1829.  
  1830.  
  1831.  
  1832.  
  1833.  
  1834.  
  1835.  
  1836.  
  1837.  
  1838.  
  1839.  
  1840.  
  1841.  
  1842.  
  1843.  
  1844.  
  1845.  
  1846.  
  1847.  
  1848.  
  1849.  
  1850.  
  1851.  
  1852.  
  1853.  
  1854.                                                                          86
  1855.  
  1856.  
  1857.  
  1858.  
  1859.  
  1860.           MOUSECURSORDEFAULT
  1861.  
  1862.             PROTOTYPE
  1863.  
  1864.             SUB MOUSECURSORDEFAULT ()
  1865.  
  1866.             INPUT
  1867.  
  1868.             no input parameters
  1869.  
  1870.             OUTPUT
  1871.  
  1872.             no value returned
  1873.  
  1874.             USAGE
  1875.  
  1876.             MOUSECURSORDEFAULT defines the mouse cursor to be a small
  1877.        ,K$╖┼╘╤░XQ)σ┤ö≡÷┴─┤àñT┘,╘¬àñX9╘⌠àñ\9╘UÜ╢≤`9╘4a╘d9╘UTa╘h9╘ta╘l9╘Uöa╘p9╘┤a╘t┘PT±x┴îÇ╖0▓ïα│ÅαU┤ôα╡ùα╢¢α╖úΓ╘pǺΓ╕¡αë ╚┴πì°sKÉφb<$⌡▌ë     φë φë I1φë  Eφë $YφÆë (mφë ,üφë 0$òφë á⌐φë ñ╜φë I¿╤φë ¼σφë ░∙φÆë 4²ë ┤!²ë ╕$5²ë ╝I²ë └]²ë ⌐8q²ë <àⁿΦiǬ∙PÖÇ ¥Ç
  1878. ⁿ░╨â@%8@ΓΦá╝╤░≡cÑÅ*$░╕≡ż≡τ╥m¿⌡ε    ╨@#µ≈$âh$âαra╨à`¥è∩Ç%Ç +─▀ TîcOî∩â°1<@  [$¿Ç¼ MMl·0ƒ Y¼─!%6a▐è ¥ì ßá+?±  P<îaTTV ╪iÇ¡≥░ `_ñ»%Çá᪠P█º»ε`éa∙É%H«┴íA%Gár∙É
  1879. iw∙Éiφ`╧≥≡╤Çmⁿ▒
  1880. ]ÆAáσw7░⌡∩    $·╟Ç√É&^`  ┐ $ⁿ  $■ $╒ nk$J-ÉQ1£PéBù »0αQ/Ñ4╜£░ºP≈Ñ4Ç⌡$(ª▀$@C]Æé≈└╕_SÇçÑ4=iÉ⌠ä╣<_np@Ñ45ò▒Y3ü¼Qí░.i>╠@5+┴╙É╛╙$@ #┴@«╦
  1881. $╤
  1882. #@Ñú4,p&e÷ü¼_ÇQºÑ4òQ  ü@;¡_áQ@e╠≥@mp!┤a╘O░√`Pñź ÇT°8ÿ!¼Åñ$½╙"q¿ PñCÇ¿α√└╥░eT"ß<p°%Pæ(╧%pδ¥/OêW0Ǽbφ φ B@[â¼8â≥µ≤(    ¿⌡%(Ç∩áTÿp+ óÜ▓0!Σ±(1±░┤ÖÇD└D0Å╡`   $ «îO@╧1
  1883. a╝╤j-0ñ│`@╖bΦaT1═⌠╝╤Σ²¼±,1öíî9lÿ28ÇÅ`Γî¿P²$,N0┴O0a╫δ≤0σú`°î╖#0δ≡└X▄1»Σî(▒¥Ç█Ñ"qá√1CÇú╟╨º Å
  1884. FT Θ²î└1ÇY0    w ²à░$@AÅ`╦Φ¼╘`▄1A  }┐Ç*5 ΩSδδî`¼îaδæ¼î5 1¿⌡Ω╜⌠ ¼¥╬ü└Qî1S╛≤î9╨iÇ,∙PU(}Ç$üÇ àÇ`σìÇ`QαÜBO$%ÿÇ╧"$Ç«Ç]É.┬\`%WÉ$  W0 ÄâO0]αG┬ur╩░£▒Q¢ú╔Ç≡°s?`X0╘`@ µWâ@╣aá εdq`¥9?Ç&+o0µyÄΣAÅuV(7P╬±@IdQ╕@Å┤@;Ç▓?Çò│CÇ┤╟╨╡KÇÄ30ⁿφ° ó╬ì+]Ä╦≡     Mö╝σ ²y5<!└▀óâ╝É3~mp    $<╛≤9Æ-2ⁿ≡@T,╞Σa,)Pæ└¥#¼╪Q┤S(¼@Aîa≡╤@Ö²±⌠KëD─┴▒▀0╨Ñ$╩-0 ╨ê*╙▓edm`î=3Kß-10è=≥≤²└£mîjy ÿe²ⁿ╨i╕e▓ΣmαÖ╢C%Ç*ê*0 EátQZ`mÄLP%    °üⁿªüNQ∙  T¿<qtWΩc z░ÅÇñΩçǪçÇ«;└<┐á¼¥. á?<Σscî)áí := 0;
  1885.       end;
  1886.     end;
  1887.   end;
  1888.   WaitToGo;
  1889. end; { UserLineStylePlay }
  1890.  
  1891.  
  1892. procedure SayGoodbye;
  1893. { Say goodbye and then exit the program }
  1894. var
  1895.   ViewInfo : ViewPortType;
  1896. begin
  1897.   MainWindow('');
  1898.   GetViewSettings(ViewInfo);
  1899.   SetTextStyle(TriplexFont, HorizDir, 4);
  1900.   SetTextJustify(CenterText, CenterText);
  1901.   with ViewInfo do
  1902.     OutTextXY((x2-x1) div 2, (y2-y1) div 2, 'That''s all folks!');
  1903.   StatusLine('Press any key to quit...');
  1904.   repeat until KeyPressed;
  1905. end; { SayGoodbye }
  1906.  
  1907.  
  1908. PROCEDURE SelectMode;
  1909. VAR
  1910.     choice1,choice2     : CHAR;
  1911.    xsize,ysize            : WORD;
  1912. BEGIN
  1913.     (* Let's select a mode *)
  1914.     ClrScr;
  1915.     WriteLn('VESADEMO:');
  1916.     WriteLn('1. 256 colors');
  1917.     WriteLn('2. 32768 colors');
  1918.     WriteLn('3. 65536 colors');
  1919.     WriteLn('4. 16777216 colors');
  1920.     WriteLn('Q uit');
  1921.     WriteLn;
  1922.     Write('Your choice: ');
  1923.     REPEAT
  1924.         ReadLn(choice1);
  1925.       IF choice1 <> '1' THEN BEGIN
  1926.           WriteLn('Sorry !');
  1927.          WriteLn('This demo wasn''t written for more as 256 colors !');
  1928.          WriteLn('You would only get a limited impression of the Hi-& TrueColor modes...');
  1929.          WriteLn('Switching to 256 colors.');
  1930.          choice1 := '1';
  1931.       END;
  1932.     UNTIL choice1 IN ['1'..'4','q'];
  1933.     IF choice1 = 'q' THEN Halt;
  1934.  
  1935.     WriteLn;
  1936.     WriteLn;
  1937.     WriteLn('a. 320x200');
  1938.     WriteLn('b. 640x480');
  1939.     WriteLn('c. 800x600');
  1940.     WriteLn('d. 1024x768');
  1941.     WriteLn('e. 1280x1024');
  1942.     WriteLn('Q uit');
  1943.     WriteLn;
  1944.     Write('Your choice: ');
  1945.     REPEAT
  1946.         ReadLn(choice2);
  1947.     UNTIL choice2 IN ['a'..'e','q'];
  1948.     IF choice2 = 'q' THEN Halt;
  1949.  
  1950.     CASE choice2 OF
  1951.         'a' : BEGIN
  1952.             xsize := 320;
  1953.             ysize := 200;
  1954.         END;
  1955.         'b' : BEGIN
  1956.             xsize := 640;
  1957.             ysize := 480;
  1958.         END;
  1959.         'c' : BEGIN
  1960.             xsize := 800;
  1961.             ysize := 600;
  1962.         END;
  1963.         'd' : BEGIN
  1964.             xsize := 1024;
  1965.             ysize := 768;
  1966.         END;
  1967.         'e' : BEGIN
  1968.             xsize := 1280;
  1969.             ysize := 1024;
  1970.         END;
  1971.     END;
  1972.     CASE choice1 OF
  1973.         '1' : mode := FindVesaMode(xsize,ysize,8);
  1974.         '2' : mode := FindVesaMode(xsize,ysize,15);
  1975.         '3' : mode := FindVesaMode(xsize,ysize,16);
  1976.         '4' : mode := FindVesaMode(xsize,ysize,24);
  1977.     END;
  1978.     IF mode = 0 THEN BEGIN
  1979.         WriteLn('No such mode could be found !');
  1980.         WriteLn('Switching to to 320x200.');
  1981.         ReadKey;
  1982.         mode := V320x200x256;
  1983.     END;
  1984. END;
  1985.  
  1986. begin { program body }
  1987.   SelectMode;
  1988.   Initialize;
  1989.   ReportStatus;
  1990.  
  1991. {  AspectRatioPlay; }
  1992.   FillEllipsePlay;
  1993.   SectorPlay;
  1994.   WriteModePlay;
  1995.  
  1996.   ColorPlay;
  1997.   { PalettePlay only intended to work on these drivers: }
  1998.   if (GraphDriver = EGA) or
  1999.       (GraphDriver = EGA64) or
  2000.       (GraphDriver = VGA) then
  2001.      PalettePlay;
  2002.   PutPixelPlay;
  2003. {  PutImagePlay; }
  2004.   RandBarPlay;
  2005.   BarPlay;
  2006.   Bar3DPlay;
  2007.   ArcPlay;
  2008.   CirclePlay;
  2009.   PiePlay;
  2010.   LineToPlay;
  2011.   LineRelPlay;
  2012. {  LineStylePlay; }
  2013. {  UserLineStylePlay; }
  2014.   TextDump;
  2015.   TextPlay;
  2016.   CrtModePlay;
  2017.   FillStylePlay;
  2018.   FillPatternPlay;
  2019.   PolyPlay;
  2020.   SayGoodbye;
  2021. {  CloseGraph; }
  2022.   CloseVesa;
  2023. end.
  2024. ***************************************************
  2025.     '* SHOW D2ROTATE (ABOUT THE ORIGIN)
  2026.     '****************************************************************∞╥≤c≤*φè#^│v/╒:j═φ0t+l▓ô"¬"g└≡?%ªêΣ│H╫½╫╜├¿U'╒⌐⌡ ßV?╩¬ujOΦçEZ1∞▐! ▄B╛Σ8║æ]1GlNÜ┐q▌▓;ô$ΦzE<cª*bEô#ä╧ñÅ"∩─LrdaÖ ╠º╫a^¥£å╬1~)@ëÖMδ╫0═6DäFê¬Çv┼ß╨kæpτ╪É)}ª 1w3╤╧ü⌡¥╓h▓╣≈ïÅaÑ[TⁿHqªÉ╝DKÄ─Y-∞tT╤Θ╨º╟╪.*ÇI9lΦ≈{πτcσ$τπßoFr╪╨∩┼╞╟;O2■e²LÜ4^N|╪½ÅO?╔°FOz`╟╟╟'<>>π$πΘù6·Xgî╖│°oîδπGƒd╝▀░?■╪╔_9L ⌡ôⁿq'æO▀ƒn4╔▀╚▄┼3pτ.òO°·}÷╕ⁿ±'æO?ít│!√8ßÑ≤/┐╣p┼≥┘E╦Vox╕cΦé5╟╚º╙$?√$≥ΘZεsî≡åìΓpKù¢ïß X╥ 9╞≈\µk┤O¥_ 5Üö\≤éÄ┌╤A[╤ÿáï┼éNⁿÅu16    g,%hc╙╨cD╨Vï┘R¢öKñR;8εáΣ╢╪ós╤π╡á└èxgzPÄMú╫yαºÉ+σJ¢i+▓â3╥    ═Ñ╙î^ºG▓█πérφçs %#(╗⌠?┼%u8≡6+QÉ))ò)Afw≈╣╪)B&4░åLXV:δät@Å.;5Φf╢Ät┐ΣJ╫─U8úÇ╟éö£╕p╔┴⌠vg╨╬╥é÷╪╣┬ΓI.ç≡^v╤ZΦÇ& ╒┌6ñô6XßNè╡╬E₧Ñ
  2027. kIº╠▄A+╣╥éb²tæ-Y¡½αÑa═uuîÇ╢αêvhuª╡SÅ┤vèùú¥F;p<d⌐/F─d█éT%▓KΦû=q■öI┐ ┐╠6S$▒÷╚ENΩ¥Fû9╔┌R'╝ ╧φ└?g┬j▓0═/b╖₧─mûé╢┌»ÿÄë/·<éò■░╤╟╢├Xσ:╥P3Θ"╬Læsφ░┌öSö!╗¿*mN£WΣÇ£┤~#╗ææ≥RΩóh:à▌.æ≈╕▌v£äàd▒à╒├=░╖π║$howeg*╬    6ù▄ƒô╕φ░Ö╢qΘD>(w@úKεHÆ╛öúΣU
  2028. éÜR╔╤W▄èê 2M%ó.▓SNÖA1ùJE╢║l]▓¿>\%└Å4ßO▄£â⌐& ê/)8vSP▀▓ôⁿææ√ü√ÑÄa⌠â╚4S╓╟P- ?Σá╕▓Næ*q╡UΘ▓≈^ñ·I.rúR&$Y^╚%è≡B┌≈Ceat
  2029.     Color := RandColor;
  2030.     SetColor(Color);
  2031.     SetFillStyle(Random(CloseDotFill)+1, Color);
  2032.     Bar3D(Random(MaxWidth), Random(MaxHeight),
  2033.           Random(MaxWidth), Random(MaxHeight), 0, TopOff);
  2034.   until KeyPressed;
  2035.   WaitToGo;
  2036. end; { RandBarPlay }
  2037.  
  2038. procedure ArcPlay;
  2039. { Draw random arcs on the screen }
  2040. var
  2041.   MaxRadius : word;
  2042.   EndAngle : word;
  2043.   ArcInfo : ArcCoordsType;
  2044. begin
  2045.   MainWindow('Arc / GetArcCoords demonstration');
  2046.   StatusLine('Esc aborts or press a key');
  2047.   MaxRadius := MaxY div 10;
  2048.   repeat
  2049.     SetColor(RandColor);
  2050.     EndAngle := Random(360);
  2051.     SetLineStyle(SolidLn, 0, NormWidth);
  2052.     Arc(Random(MaxX), Random(MaxY), Random(EndAngle), EndAngle, Random(MaxRadius));
  2053.     GetArcCoords(ArcInfo);
  2054.     with ArcInfo do
  2055.     begin
  2056.       Line(X, Y, XStart, YStart);
  2057.       Line(X, Y, Xend, Yend);
  2058.     end;
  2059.   until KeyPressed;
  2060.   WaitToGo;
  2061. end; { ArcPlay }
  2062.  
  2063. procedure PutPixelPlay;
  2064. { Demonstrate the PutPixel and GetPixel commands }
  2065. const
  2066.   Seed   = 1962; { A seed for the random number generator }
  2067.   NumPts = 2000; { The number of pixels plotted }
  2068.   Esc    = #27;
  2069. var
  2070.   I : word;
  2071.   X, Y, Color : word;
  2072.   XMax, YMax  : integer;
  2073.   ViewInfo    : ViewPortType;
  2074. begin
  2075.   MainWindow('PutPixel / GetPixel demonstration');
  2076.   StatusLine('Esc aborts or press a key...');
  2077.  
  2078.   GetViewSettings(ViewInfo);
  2079.   with ViewInfo do
  2080.   begin
  2081.     XMax := (x2-x1-1);
  2082.     YMax := (y2-y1-1);
  2083.   end;
  2084.  
  2085.   while not KeyPressed do
  2086.   begin
  2087.     { Plot random pixels }
  2088.     RandSeed := Seed;
  2089.     I := 0;
  2090.     while (not KeyPressed) and (I < NumPts) do
  2091.     begin
  2092.       Inc(I);
  2093.         PutPixel(Random(XMax)+1, Random(YMax)+1, RandColor);
  2094.     end;
  2095.  
  2096.     { Erase pixels }
  2097.     RandSeed := Seed;
  2098.     I := 0;
  2099.     while (not KeyPressed) and (I < NumPts) do
  2100.     begin
  2101.       Inc(I);
  2102.       X := Random(XMax)+1;
  2103.       Y := Random(YMax)+1;
  2104.       Color := GetPixel(X, Y);
  2105.         if Color = RandColor then
  2106.           PutPixel(X, Y, 0);
  2107.      end;
  2108.   end;
  2109.   WaitToGo;
  2110. end; { PutPixelPlay }
  2111.  
  2112. procedure PutImagePlay;
  2113. { Demonstrate the GetImage and PutImage commands }
  2114.  
  2115. const
  2116.   r  = 20;
  2117.   StartX = 100;
  2118.   StartY = 50;
  2119.  
  2120. var
  2121.   CurPort : ViewPortType;
  2122.  
  2123. procedure MoveSaucer(var X, Y : integer; Width, Height : integer);
  2124. var
  2125.   Step : integer;
  2126. begin
  2127.   Step := Random(2*r);
  2128.   if Odd(Step) then
  2129.     Step := -Step;
  2130.   X := X + Step;
  2131.   Step := Random(r);
  2132.   if Odd(Step) then
  2133.     Step := -Step;
  2134.   Y := Y + Step;
  2135.  
  2136.   { Make saucer bounce off viewport walls }
  2137.   with CurPort do
  2138.   begin
  2139.     if (x1 + X + Width - 1 > x2) then
  2140.       X := x2-x1 - Width + 1
  2141.     else
  2142.       if (X < 0) then
  2143.         X := 0;
  2144.     if (y1 + Y + Height - 1 > y2) then
  2145.       Y := y2-y1 - Height + 1
  2146.     else
  2147.       if (Y < 0) then
  2148.         Y := 0;
  2149.   end;
  2150. end; { MoveSaucer }
  2151.  
  2152. var
  2153.   Pausetime : word;
  2154.   Saucer    : pointer;
  2155.   X, Y      : integer;
  2156.   ulx, uly  : word;
  2157.   lrx, lry  : word;
  2158.   Size      : word;
  2159.   I         : word;
  2160. begin
  2161.   ClearDevice;
  2162.   FullPort;
  2163.  
  2164.   { PaintScreen }
  2165.   ClearDevice;
  2166.   MainWindow('GetImage / PutImage Demonstration');
  2167.   StatusLine('Esc aborts or press a key...');
  2168.   GetViewSettings(CurPort);
  2169.  
  2170.   { DrawSaucer }
  2171.   Ellipse(StartX, StartY, 0, 360, r, (r div 3)+2);
  2172.   Ellipse(StartX, StartY-4, 190, 357, r, r div 3);
  2173.   Line(StartX+7, StartY-6, StartX+10, StartY-12);
  2174.   Circle(StartX+10, StartY-12, 2);
  2175.   Line(StartX-7, StartY-6, StartX-10, StartY-12);
  2176.   Circle(StartX-10, StartY-12, 2);
  2177.   SetFillStyle(SolidFill, MaxColor);
  2178.   FloodFill(StartX+1, StartY+4, GetColor);
  2179.  
  2180.   { ReadSaucerImage }
  2181.   ulx := StartX-(r+1);
  2182.   uly := StartY-14;
  2183.   lrx := StartX+(r+1);
  2184.   lry := StartY+(r div 3)+3;
  2185.  
  2186.   Size := ImageSize(ulx, uly, lrx, lry);
  2187.   GetMem(Saucer, Size);
  2188.   GetImage(ulx, uly, lrx, lry, Saucer^);
  2189. {  PutImage(ulx, uly, Saucer^, XORput);               { erase image }
  2190.  
  2191.   { Plot some "stars" }
  2192.   for I := 1 to 1000 do
  2193.      PutPixel(Random(MaxX), Random(MaxY), RandColor);
  2194.   X := MaxX div 2;
  2195.   Y := MaxY div 2;
  2196.   PauseTime := 70;
  2197.  
  2198.   { Move the saucer around }
  2199.   repeat
  2200. {     PutImage(X, Y, Saucer^, XORput);                 { draw image }
  2201.      Delay(PauseTime);
  2202. {     PutImage(X, Y, Saucer^, XORput);                 { erase image }
  2203.      MoveSaucer(X, Y, lrx - ulx + 1, lry - uly + 1);  { width/height }
  2204.   until KeyPressed;
  2205.   FreeMem(Saucer, size);
  2206.   WaitToGo;
  2207. end; { PutImagePlay }
  2208.  
  2209. procedure PolyPlay;
  2210. { Draw random polygons with random fill styles on the screen }
  2211. const
  2212.   MaxPts = 5;
  2213. type
  2214.   PolygonType = array[1..MaxPts] of PointType;
  2215. var
  2216.   Poly : PolygonType;
  2217.   I, Color : word;
  2218. begin
  2219.   MainWindow('FillPoly demonstration');
  2220.   StatusLine('Esc aborts or press a key...');
  2221.   repeat
  2222.     Color := RandColor;
  2223.     SetFillStyle(Random(11)+1, Color);
  2224.     SetColor(Color);
  2225.     for I := 1 to MaxPts do
  2226.       with Poly[I] do
  2227.       begin
  2228.         X := Random(MaxX);
  2229.         Y := Random(MaxY);
  2230.       end;
  2231.     FillPoly(MaxPts, Poly);
  2232.   until KeyPressed;
  2233.   WaitToGo;
  2234. end; { PolyPlay }
  2235.  
  2236. procedure FillStylePlay;
  2237. { Display all of the predefined fill styles available }
  2238. var
  2239.   Style    : word;
  2240.   Width    : word;
  2241.   Height   : word;
  2242.   X, Y     : word;
  2243.   I, J     : word;
  2244.   ViewInfo : ViewPortType;
  2245.  
  2246. procedure DrawBox(X, Y : word);
  2247. begin
  2248.   SetFillStyle(Style, MaxColor);
  2249.   with ViewInfo do
  2250.     Bar(X, Y, X+Width, Y+Height);
  2251.   Rectangle(X, Y, X+Width, Y+Height);
  2252.   OutTextXY(X+(Width div 2), Y+Height+4, Int2Str(Style));
  2253.   Inc(Style);
  2254. end; { DrawBox }
  2255.  
  2256. begin
  2257.   MainWindow('Pre-defined fill styles');
  2258.   GetViewSettings(ViewInfo);
  2259.   with ViewInfo do
  2260.   begin
  2261.     Width := 2 * ((x2+1) div 13);
  2262.     Height := 2 * ((y2-10) div 10);
  2263.   end;
  2264.   X := Width div 2;
  2265.   Y := Height div 2;
  2266.   Style := 0;
  2267.   for J := 1 to 3 do
  2268.   begin
  2269.     for I := 1 to 4 do
  2270.     begin
  2271.       DrawBox(X, Y);
  2272.       Inc(X, (Width div 2) * 3);
  2273.     end;
  2274.     X := Width div 2;
  2275.     Inc(Y, (Height div 2) * 3);
  2276.   end;
  2277.   SetTextJustify(LeftText, TopText);
  2278.   WaitToGo;
  2279. end; { FillStylePlay }
  2280.  
  2281. procedure FillPatternPlay;
  2282. { Display some user defined